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

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

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

12678 次点击
所在节点    PHP
119 条回复
ant_sz
2015-07-11 19:40:49 +08:00
我觉得楼上有提出来既然数组是给定的,那么我们自己先吧乘积(在计算机之外)算出来,然后看看是不是整除确实是一种可以说的过去的方法。因为在其他某些算法中也有类似这样预先定义好常数的方法。

然而如果这道题真的是这个意思,那么这道题和这个算法其实都没有什么卵用。一个用脑筋急转弯题要求面试者提供一个不能通用的函数的企业最好还是敬而远之。
codercai
2015-07-11 20:02:04 +08:00
@nozama 看来看去,你这个本质上依然是遍历呀,和在for循环中依次条件测试没有什么区别,依次检查了53出现之前的所有元素
codercai
2015-07-11 20:08:44 +08:00
@ningyuqiao456 楼主你再看看,nozama的方法和遍历没有两样好嘛,仍然是依次遍历了目标53出现之前的所有元素。此题,貌似不遍历不行,至少遍历一部分
codercai
2015-07-11 20:12:13 +08:00
@ant_sz 然而乘积也是要遍历所有元素的呀
codercai
2015-07-11 20:16:36 +08:00
@latyas XOR“原始数组”不需要遍历么?,不便利如如何提取数组元素
latyas
2015-07-11 20:42:47 +08:00
@codercai 不用遍历啊,对折取XOR,假设支持无限长度的内存,23333
nozama
2015-07-11 20:50:01 +08:00
@codercai 一般所说的“遍历”, 应该是“在运行时循环”的意思,递归本质也是循环。所以我刚想到另一个办法, 用!模!板!:
(每次调用的find都不是同一个函数...所以不是递归,也不是循环...)

template<int N>
bool find(int num, int* arr)
{
std::cout << N << " ";
if(arr[N] == num) return true;

return find<(N-1)>(num, arr);
}

template <>
bool find<0>(int num, int* arr)
{
return false;
}

void main()
{
auto found = find<6>(55, arr);
}
nozama
2015-07-11 20:56:36 +08:00
修正
template<int N>
bool find(int num, int* arr)
{
if(arr[N] == num) return true;

return find<(N-1)>(num, arr);
}

template <>
bool find<-1>(int num, int* arr)
{
return false;
}


int main()
{
int arr[] = {1,22,56,53,34,51,77};
auto found = find<6>(1, arr);

assert(found);
}
9o
2015-07-11 20:59:08 +08:00
为什么会有这个数组?Who set it ? Or it just someone set here ? Why not go to ask the man who set this rule :)
laoyuan
2015-07-11 21:20:19 +08:00
各种跪!
tushiner
2015-07-11 22:55:17 +08:00
问题的关键在于“取出元素”,只要取出来了,判断是53就算完成任务了。。。
var arr = [1,22,56,53,34,51,77];
var timer = setInterval(function(){
if(arr[Math.floor(Math.random()*arr.length)]==53)clearInterval(timer);
},250);
realpg
2015-07-11 23:16:42 +08:00
这不是PHP节点么,楼上的大多数们难道没有发现?

$arr=array(1,22,56,53,34,51,77);
$ret=testArray($arr);
die($ret);

function testArray($array) {
$str=implode($array);
if (strpos(str,'5')===false) return false;
return true;
}
ant_sz
2015-07-11 23:47:23 +08:00
@codercai

然而乘积的结果可以作为一个常数直接硬编码到代码里。。。这就是我说的在计算机之外算。最后写出来的程序实际上等价于直接return true。。。因为除了用来判断 53 在里面之外没有任何其他可用之处。

确实有一些算法是允许直接放这样的常量进去的。比如我们要reverse一个32bit的integer,可以先吧他分成四个8bit的组,每一组直接用硬编码的逆转表来查。这种方法在reverse integer这个问题里是合适的。所以我觉得放在这个茶53的问题里也勉强可以接受。

只是觉得出这种题的企业真是蛋疼。。。应该把名字告诉大家让大家果断绕道。。。
tuutoo
2015-07-11 23:54:49 +08:00
C#的,PHP不知道能做到吗。。

class Program
{
static void Main(string[] args)
{
int[] intArray = { 1, 22, 56, 53, 34, 51, 77 };
Dictionary<int, bool> dictionary = intArray.ToDictionary(v => v, v => true);

Console.WriteLine(dictionary.ContainsKey(53));
Console.ReadKey();
}
}
elvba
2015-07-12 01:38:50 +08:00
@realpg implode 也是内部函数,而且也用到了遍历。
mingyun
2015-07-12 17:15:23 +08:00
@proudzhu 好机智
swolf119
2015-07-12 22:10:05 +08:00
我觉得这样的题设是在考 :不要把很简单的事情想复杂
function fuck(){
return true;
}
szopen
2015-07-13 10:32:56 +08:00
话说写程序不是讲究精确没有BUG吗?
但是为什么考面试程序员的题目全都不那么精确,一堆BUG
cxyfreedom
2015-07-13 10:50:44 +08:00
判断数组里面一个数是否存在,好像各种方法某种意义上都有遍历吧,我是没想明白,有解答吗

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

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

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

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

© 2021 V2EX