免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6938 | 回复: 20
打印 上一主题 下一主题

[算法] 从一百个数中找不存在的数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-22 15:47 |只看该作者 |正序浏览
碰到个面试题目,有一百个1到100的数字,为乱序的,其中缺一个数字,简述用什么方法能够最快速的查找出缺的那个数字,以及循环多少次?大家有什么好的解法?

论坛徽章:
0
21 [报告]
发表于 2013-01-06 19:00 |只看该作者
假设重复的是X,缺的是Y,假设数组为a1,a2....a100,和为S
X-Y = S - 5050
X^Y = (1^2^...^100)^(a1^...^a100)
再遍历一遍,可解上面两个方程式
空间O(1), 时间O(N)

论坛徽章:
0
20 [报告]
发表于 2013-01-06 18:47 |只看该作者
回复 5# InMySin

其实本质是异或的逆运算是异或自己吧,
比如c = a^b;    b = c^a; 也就是 a^b^a = b, 一个数异或另一个数两次其值不变。
   

论坛徽章:
0
19 [报告]
发表于 2013-01-06 18:26 |只看该作者
貌似可以用集合的概念,就是标准模版库里面的

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
18 [报告]
发表于 2013-01-06 16:44 |只看该作者
回复 7# folklore


    这个要用 ^ 吧?

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
17 [报告]
发表于 2012-11-26 23:34 |只看该作者
2L正解

论坛徽章:
0
16 [报告]
发表于 2012-11-26 13:43 |只看该作者
方法:
1.【时空复杂度O(nlogn)】排序+扫描,找出重复的那个【挨在一块】,即可求出缺失的;
2.【时空复杂度O(n)】申请数组flag[100],初始化为0,扫描数组,将相应的flag + 1,如果变成2,说明该值重复,从而可以得到缺失的;
3.【时间复杂度O(n),空间复杂度O(1)】
扫描一次,求得和S1, 和平方和S2:
设缺失的数为X, 重复的为Y;则有方程:
Y - X = S1 - (1+2+3....+100);
Y^2 - X ^2 = S2 - (1^2+2^2+....+100^);
即可求得X,Y
回复 1# rdcwayx


   

论坛徽章:
0
15 [报告]
发表于 2012-11-26 13:40 |只看该作者
题目的意思我理解了有点歧义,是100个数字里 拿走一个,还剩99个数,求出缺的那个数,还是说100个数里,有1个唯一重复的数字。
前者的话,用异或能解决,后一个再想想。。
  1. #include<stdio.h>

  2. int get_miss_no(int *data, int n);

  3. int main(void)
  4. {
  5.     int arr[4] = {5,2,1,3}; //假设5个数字中随机扣掉1个,还剩4个
  6.     printf("\nmiss no is %d\n", get_miss_no(arr,4));   
  7.     return 0;
  8. }

  9. int get_miss_no(int *arr, int n)
  10. {
  11.     int miss_no = arr[0];
  12.     for(int i = 1; i < n; i++)
  13.                 miss_no ^= arr[i];
  14.     for(int i = 0; i < n+1; i++)
  15.         miss_no ^= i+1;
  16.     return miss_no;
  17. }
复制代码

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
14 [报告]
发表于 2012-11-26 10:10 |只看该作者
循环一次,但做两个逻辑
1重复检测,2累加

当然循环两次也是OK的

论坛徽章:
0
13 [报告]
发表于 2012-11-26 09:52 |只看该作者
BITMAP啊 ~~
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP