{1,22,56,53,34,51,77}这是一个数组,如何不用内部函数和遍历数组的方法判断出 53 在这个数组里。(面试问题)

2015-07-10 22:02:34 +08:00
 ning1022

我想到了php中的in_array()函数。但是很明显不对。

12675 次点击
所在节点    PHP
119 条回复
Clarencep
2015-07-11 15:02:34 +08:00
遇到这种公司,直接拜拜是最好的选择;要是进去了,还不知道会遇到什么213的产品经理呢,到那时就欲哭无泪了。
kurtis
2015-07-11 15:26:32 +08:00
{1,22,56,53,34,51,77}这是一个数组 ( 这是已知条件),
如何不用内部函数和遍历数组的方法判断出 53 在这个数组里。(这是问题)

答:function checkIf53Exist() { return true;}

!!!!!!!!! 重要 !!!!!!!!!!!

已知条件里已经包含53了,又没有问你任意数组,你们还争论遍历和查找个毛啊,典型的审题不清。
都是程序猿思维,我要是考官,给我说算法的人,统统OUT。
laoyuan
2015-07-11 15:44:50 +08:00
@013231 @znoodl @sketch33
怎么乘?当然是用计算器了,难不成口算??!

function check_in_array($prime, $product) {return !($product % $prime);}
var_dump(check_in_array(53, 8718191328));

完美解决!
laoyuan
2015-07-11 15:46:25 +08:00
看那乘积,果然是大数据!
hooluupog
2015-07-11 15:57:21 +08:00
一般面试考这类东西都是考算法的。
所以这个题十有八九是让你给出一个时间复杂度小于O(n)的算法来找出某个元素。
有序数组,直接2分查找;
部分有序或者是循环有序数组,也是采用划分的思想,不过需要确定单调区间来决定每次查找的区间。
楼主给的这个数组感觉有问题啊。
justahappy
2015-07-11 16:08:53 +08:00
@laoyuan 毕竟低学历,只是个自由职业者,真不知道哪来的自信。。。。。
laoyuan
2015-07-11 16:14:26 +08:00
@justahappy 毕竟写了8年PHP,这点自信还是有的哇哈哈哈
JackWindows
2015-07-11 16:20:35 +08:00
好无聊啊,大家都在说生成随机数然后判重
正确姿势难道不是生成一个len(array)的排列,然后按这个序号去访问么?生成排列有线程算法吧
sketch33
2015-07-11 16:25:08 +08:00
@laoyuan 为了避免程序遍历整个数组,改为人工遍历整个数组。我怎么就没想到这么好的方法呢?
ChangxuBlack
2015-07-11 16:35:18 +08:00
@Septembers 好吧,我以为可以先对数组做预处理呢
l12ab
2015-07-11 16:39:32 +08:00
数组转json,然后strpos
laoyuan
2015-07-11 16:47:16 +08:00
@sketch33 对,人工遍历可以提高系统鲁棒性,比如停电什么的就不怕了
jimiton
2015-07-11 16:47:31 +08:00
@laoyuan ...你让我心碎。。。的无以复加
kzzhr
2015-07-11 17:09:24 +08:00
转成字符串的本质也是遍历,如果这个也不可以的话,问题就转换成了薛定谔的猫:如何在不查看数组元素的办法猜里面是啥样
bramblex
2015-07-11 17:25:45 +08:00
每一种方法都在遍历啊卧槽……
BooksE
2015-07-11 17:27:50 +08:00
@procen424 赞同,检查每一个位.不过不知道出题人到底是啥意思
latyas
2015-07-11 17:41:36 +08:00
大小都没超过128,7个8bit的数位, 53->00110101
00110101001101010011010100110101001101010011010100110101
XOR 原始数组

如果53在其中,则会有序数为8的整数倍开始的连续的8个0
所以目标是是检测是否有这样的 00000000

对XOR结果的第一第二字节 和第四第五字节 取AND操作,得到的结果和 (11111111第三字节位码) 取AND操作,得到一个结果a

if !( a & b0000000011111111) || !(a & b1111111100000000)

则认为53在原始数组中, 瞎说的 不知道对不对
好像没遍历?
wy315700
2015-07-11 17:43:18 +08:00
@sirgod
@laoyuan
不遍历怎么乘起来
yiplee
2015-07-11 17:54:38 +08:00
将 Array 转为 Set ,再记下集合里面元素的个数,然后添加 53 进去。如果集合里面元素个数多了一个,那么 53 不在里面;如果保持不变,那么在里面。(我瞎扯的)
liuchang0812
2015-07-11 19:11:19 +08:00
难道没人知道 bloom filter?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/204852

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX