今天面试遇到的一个智力题,求助...

sc0000082 2010-12-17 06:56:30
有一个包含100个元素的数组,存放1到100这100个数,但其中缺少一个数字,数组未排序,怎么快速找到缺哪个数字?
...全文
551 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
longsir2008 2011-04-06
  • 打赏
  • 举报
回复
先加 在 减
zhouliang0806 2011-04-04
  • 打赏
  • 举报
回复
算法复杂度应该能减到O(n)。
用空间换取时间的方法,定义一个数组a[100]存放1-100;
遍历给的100个数,b[i-1]=-1,i为循环的数值,b[100]中,谁不为-1,则缺少哪个数。
和上面一样,也为O(n).
xali 2011-03-19
  • 打赏
  • 举报
回复
再repeat+(5050-sum);
xali 2011-03-19
  • 打赏
  • 举报
回复
如果没有重复项:5050-sum;//sum是原来的数组和
如果有重复项:找出重复项repeat,再repeat-(5050-sum);
flycar 2011-01-14
  • 打赏
  • 举报
回复

#define MAX_NUM 100
#define MIN_NUM 1

int org[MAX_NUM]; // You array
int dest[MAX_NUM] = {0};
int i;

// fill the original array here
// TODO ...

for(i=0; i<MAX_NUM; i++) {
if (org[i] > MAX_NUM || org[i] < MIN_NUM) {
// printf("error: %d\n", org[i]);
continue;
}
dest[org[i]-1]++;
}

for(i=MIN_NUM-1; i<MAX_NUM; i++) {
if (dest[i] == 0) {
printf("missing: %d\n", i+1);
} else if (dest[i] > 1) {
printf("repeated: %d, count=%d\n", i+1, dest[i]);
}
}
szuzsq 2010-12-31
  • 打赏
  • 举报
回复
+起来,比5050少多少,就缺什么
luciferisnotsatan 2010-12-30
  • 打赏
  • 举报
回复
12的正解
k466150626 2010-12-30
  • 打赏
  • 举报
回复
存了1到100的数 少了一个 1到100求和=5151
然后对数组的所有元素求和 方法就不用说了 大家都知道
int i = 0;
int Num[100];
int sum[100] ;
sum[0] = 0;
for(i=0;i<100;++i)
{
sum[i+1] =sum[i]+Num[i]
}
用 5150-sum[i] = number(这个number就是你要求的数)
chengtg 2010-12-29
  • 打赏
  • 举报
回复
很明显LZ没吧问题说清楚,导致有了两种理解,看来有一半人的回答是彻底没用了...
还是说清楚好....
PG 2010-12-19
  • 打赏
  • 举报
回复
蛋疼的题目?
luuillu 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 luuillu 的回复:]
另一种方法:
如果n=100个数一个也不缺,则总和为S1= n*(n+1)/2 ,这100个数的平方和为Q1=n*(n+1)(2*n+1)/2
当其中缺了一个x而多了一个y时,总和为S2=S1-x+y ,平方和为Q2=Q1-x*x+y*y
解这个二元方程组可得 x=(Q1-Q2)/( 2*(S1-S2) ) +(S1-S2)/2


C/C++ code

#define N 1……
[/Quote]

刚才忘了上面的计算应该使用浮点数。
luuillu 2010-12-19
  • 打赏
  • 举报
回复
另一种方法:
如果n=100个数一个也不缺,则总和为S1= n*(n+1)/2 ,这100个数的平方和为Q1=n*(n+1)(2*n+1)/2
当其中缺了一个x而多了一个y时,总和为S2=S1-x+y ,平方和为Q2=Q1-x*x+y*y
解这个二元方程组可得 x=(Q1-Q2)/( 2*(S1-S2) ) +(S1-S2)/2


#define N 100
#include <stdio.h>
int main ()
{
int aim[N];//你的存放1-100整数的数组
int S1=N*(N+1)/2;
int Q1=N*(N+1)(2*N+1)/2;
int S2=0;
int Q2=0;
int result;
int i;
for(i = 0; i < 100; i++)
{
S2+=aim[i];
Q2+=aim[i]*aim[i];
}
result=(Q1-Q2)/( 2*(S1-S2) ) +(S1-S2)/2;

printf("%d\n",result);
}




luuillu 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hdusunny44 的回复:]
引用 9 楼 pluminsnow 的回复:

上一个代码作废
C/C++ code

int aim[100];//你的存放1-100整数的数组
int check[100] = {0};
for(int i = 0; i < 100; i++)
{
if(check[aim[i]] == -1)return aim[i];
check[aim[i]] = -1;
}

……
[/Quote]
既然应用了状态测试,就没有必要再进行异或运算了,直接检查check数组中那个元素没有从0变成-1不就是结果了吗。

#include <stdio.h>
int main ()
{
int aim[100];//你的存放1-100整数的数组
int check[101] = {0}; 多加一个做监视哨
int repeat;//重复的数字
int res=0;//要找的数字
int i;
for(i = 0; i < 100; i++)
check[aim[i]] == -1; //把数字对应的位置置-1,缺的那个数的位置不会被改变,仍是0

for(i=0;check[i]!=0;i++); //遇到0时跳出循环。

res=i+1; //下标从0开始,而实际需从1开始,所以+1
printf("%d\n",res);
}

sduxiaoxiang 2010-12-18
  • 打赏
  • 举报
回复
我觉得5050去减的方法不一定行得通 关键有一个重复的

prohibit 2010-12-18
  • 打赏
  • 举报
回复
#include <stdio.h>
#define N 10//可以定义成100

int main(void)
{
int arr[N] = {5,2,1,8,3,10,7,4,9,10};//存放数字的数组、包括重复的数字,这里重复的是10
int a[N] = {0};//判断重复数字用到的数组
int ret = 0, i = 0;

for(i = 0; i < N; i++)
{
if(a[arr[i] - 1] == 0)
a[arr[i] - 1] = 1;//若数字arr[i]第一次出现,则将其值置为1、并记录到数组a中
else if(a[arr[i] - 1] == 1)//数字arr[i]重复
{
ret = arr[i];
break;
}
}
printf("The repeat number is %d.\n", ret);
return 0;
}
matrixcl 2010-12-18
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 liuzx2005 的回复:]
十二楼正解!!!!!不过也可以用二分法!!!
[/Quote]

任何时候用二分法的前提都是有序
西电菜鸟 2010-12-18
  • 打赏
  • 举报
回复
上面打是为了便于理解写成以上形式,不是代码,相信意思已经很明确了!
liuzx2005 2010-12-18
  • 打赏
  • 举报
回复
十二楼正解!!!!!不过也可以用二分法!!!
liuzx2005 2010-12-18
  • 打赏
  • 举报
回复
缺少一个意味着有一个数是重复的吧
西电菜鸟 2010-12-18
  • 打赏
  • 举报
回复
有一个方法最简单
int a=(1+2+3+...+100)-(a[1]+a[2]+a[3]+...+a[99])=res-repeat
double b=(1*2*3*...*100)/(a[1]*a[2]*a[3]*...*a[99])=res/repeat
res=ab/(1-b)
res:缺少的数
repeat:重复的数
加载更多回复(27)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧