求微软面试题:有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字

jyzdtn 2011-07-27 10:57:01
加精
数字 是1到9中间的
...全文
31383 470 打赏 收藏 转发到动态 举报
写回复
用AI写文章
470 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangloya 2014-02-11
  • 打赏
  • 举报
回复
引用 71 楼 zhao4zhong1 的回复:
[Quote=引用 69 楼 hxtmac 的回复:] 你题目理解错了吧。 引用 27 楼 zhao4zhong1 的回复: 仅供参考C/C++ code //有一个数组,存储的元素为1到10000000的任意数,在其中查找出一个重复的数字 #include <stdio.h> int a[3]={1,10000000,10000000}; static unsigned char b[10000000/8+1]; int i; …… [/Quote] 都说了“仅供参考”嘛;又没说“正解在此”。嘿嘿。
你题目理解错了
chchch521761 2013-11-14
  • 打赏
  • 举报
回复
如果是保存在一个数组里面:用排除法很好,但要对每个数字出现的数字要做标记,不然排除法达不到效果 如果保存在一字符串里面就最好不要用上面的方法了。我有一个很好的方法。
红色贝鱼 2013-07-25
  • 打赏
  • 举报
回复
100万为1000* 1000 约为 1024 *1024, 2的20次方可以表示。假设用20层的二叉树来,因为数字都在可以转为2进制存储,所以每个数字都可以表示为101010101010的形式,放入这个二叉树中,0往左子树放,1往右子树放,如果不重复,可以放完。 那么我们构建这个20层的平衡二叉树后,结构是 {bool stored;tree*left;tree *right;}, 开始 stored都为false,放入后为true,那么当为true的时候有放入,便是重复,根据它的二进制排列,找出重复的数。
linspecial 2012-10-03
  • 打赏
  • 举报
回复
00000001
00000010
00000100
00001000

3->10000
00010000

5->100000
00100000

6->1000000
01000000

7->1000000
10000000

00000001 1
00000010 2
00000100 4
00001000 8
00010000 3
00100000 5
01000000 6
10000000 7

然后再相加看哪位总和>2? 全部大于2的话就是 9
sunny_lz 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
引用 21 楼 wangwoo 的回复:

用word打开,Ctrl-F搜寻,分别输入1,2,3~9,搜寻到第3个的,换个数字.
伤不起
[/Quote]


思想很独特
hua0ge0 2012-08-24
  • 打赏
  • 举报
回复
#include <stdio.h>
#include "windows.h"
int main()
{
int i,j,s;
int a[10] = {0},b[10] = {0};//a数组记录对应下标的数字的个数,b数组记录个数达到3的数字
int num[] = {1,4,3,2,2,6,6,7,1,7,7,4,3,2,7,8,9,1,9,5,7,3,4,6,7,8,5,8,5,3,8};//一百万个数字简化为num数组
i = j = s =0;
while(num[i])
{
if (b[num[i]] == num[i]) //当数字个数达到3就跳过
{
++i;
continue;
}
a[num[i]] += 1;
if (a[num[i]] >= 3)
{
b[num[i]] = num[i];
s += b[num[i]]; //s记录个数达到3的数字之和
++j;
if (j == 8 && s >=36 && s <= 44) //当出现了8个“个数达到3的”数字,相加的和的范围是(36,44)
{
printf("the number is:%d\n",45 - s); // 45-s 就可以得到那个“个数没达到3的”数字
exit(1);
}
}
++i;
}
return 0;
}

小弟的程序也是从头开始遍历,直到可以判断出那个只出现两次的数字(其他8个数组都出现了3次及以上了)a数组中最大值为3,b数组中最大值为9,不存在越界问题。本程序对100万个数字的处理过于简洁,相信这不是重点。
hua0ge0 2012-08-24
  • 打赏
  • 举报
回复

#include <stdio.h>
#include "windows.h"
int main()
{
int i,j,s;
int a[10] = {0},b[10] = {0};//a数组记录对应下标的数字的个数,b数组记录个数达到3的数字
int num[] = {1,4,3,2,2,6,6,7,1,7,7,4,3,2,7,8,9,1,9,5,7,3,4,6,7,8,5,8,5,3,8};//一百万个数字简化为num数组
i = j = s =0;
while(num[i])
{
if (b[num[i]] == num[i]) //当数字个数达到3就跳过
{
++i;
continue;
}
a[num[i]] += 1;
if (a[num[i]] >= 3)
{
b[num[i]] = num[i];
s += b[num[i]]; //s记录个数达到3的数字之和
++j;
if (j == 8 && s >=36 && s <= 44) //当出现了8个“个数达到3的”数字,相加的和的范围是(36,44)
{
printf("the number is:%d\n",45 - s); // 45-s 就可以得到那个“个数没达到3的”数字
exit(1);
}
}
++i;
}
return 0;
}
forwrj 2012-08-24
  • 打赏
  • 举报
回复
1.1000000个数,只有一个数是会出现2次 不出意外其它8个都会出现的次数大于2次。
解决方法 找出大于2位数的其它8位,还有一个肯定就是要找和数。
chen19901204 2012-08-23
  • 打赏
  • 举报
回复
我的想法是 用一个计数 count, 初始为9,一个数组 int dig[9]
开始遍历,每次的时候判断是一下那个数的次数是否大于3,如果大于的话,直接就踢掉 count--,如果没编译完,count 就等于1 那样的话就直接输出那个数组小于3的数 结束编译, 如果遍历结束了 count 还是大于1的话 那就找到次数为2的数 输出
KKGBIT 2012-06-01
  • 打赏
  • 举报
回复
比较同意遍历一次的算法。然后标志位加1,每个出多少次都算的出来,远超过微软领导的要求......
最好再排成11111222234444444444445555.....99999999的形式,那么以后领导要别的(比如出现3次的)也找得到了。。

还有个想法,不知道弱弱的说,行还是不行
先把1~9每个数字各找出来一个,去除,用遍历法。从头开始,直到每个都出现过了。然后还剩下1百万减9个。
然后再找有且仅有一个的:前面找过的那些,找有没有出过2次的;后边没找过得,看有没有谁没有出现,或只出现1次。这样就找到了。。。。
我也不知道了,反正就从2次递推到1次,就这样想的了,如果“有且既有1个数字出现过5次”,
则可以递归到4、3、2、1,分四步了。

等等等等。。。。。。:(

关注中。。。。。。。。。


吓人的鸟 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

引用 23 楼 tomosun 的回复:

引用 21 楼 wangwoo 的回复:

用word打开,Ctrl-F搜寻,分别输入1,2,3~9,搜寻到第3个的,换个数字.
伤不起


恩,还是word打开,这么高级。。。记事本行不?
[/Quote]
用vim吧....
nice_cxf 2012-05-11
  • 打赏
  • 举报
回复
最坏情况必然要遍历完全
前边只有2个8和2个9,最后一个是9,你不遍历到最后一个你能知道到底是8还是9?
感觉没啥好办法,排除法就是了
吓人的鸟 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 443 楼 的回复:]

参考字符串查找方法,使用KMP,详细请参考《数据结构》,这个应该是比较理想的吧。
[/Quote]
这种说白了跟用ctrl+f把九个数字找一遍是一样的....
还是遍历+统计排除,遇到没有出现的数字或者只出现一次的数字时得完整遍历....
吓人的鸟 2012-05-11
  • 打赏
  • 举报
回复
受不了那些遍历还贴代码的人了,大家期待的是一个好的算法和思路,有了算法,代码谁不会写啊...
遍历+统计+排除..神马的是下下策,期待高人出现....
renjun0106 2012-05-10
  • 打赏
  • 举报
回复
我觉得 从概率论的角度看问题:一直从中随机取出输,直到(比如取1000次)有一个数没有出现,去不成取不出来的数就是所得数,若真的取出来了,是小概率事件,可以忽略吧~~~(如真的取出来了,怪人品吧)
gamer_x 2011-11-23
  • 打赏
  • 举报
回复
高~~

[Quote=引用 21 楼 wangwoo 的回复:]
用word打开,Ctrl-F搜寻,分别输入1,2,3~9,搜寻到第3个的,换个数字.
[/Quote]
Gongqingshuai 2011-11-23
  • 打赏
  • 举报
回复
有可能只出现一次吗
Gongqingshuai 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jernymy 的回复:]

比如有
1,3,1,5,3,9,3,5,6,4,7,5,1,2,
等这样数字公100万个

C/C++ code


/*******************************************************************************
文 件 名 : test100.cpp
实现功能 : 微软面试题:
有100万个数字(……
[/Quote]
如果我有一个数只出现了一次呢
wesweeky 2011-11-23
  • 打赏
  • 举报
回复
我记得是抑或
slkf 2011-11-23
  • 打赏
  • 举报
回复
估计微软考得不是如何让最坏情况的时间变得最小,而是平均时间(即所有情况需要的时间加决/所有情况的个数)?
加载更多回复(450)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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