免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: qishking
打印 上一主题 下一主题

有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
1 [报告]
发表于 2011-08-08 10:20 |显示全部楼层
这令我想起,以前当一副扑克多了一张相同底色的牌时,为了找出那张牌,一张张发,按点数分成一堆堆,当那一堆的牌超出时,那张就是多余的了!这题也可用类似的算法,比如一万个数,一百个一组,将数据大小加到1百、或2百、或3百……里,当那组超出一百,就在那组里,再递归找出来。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
2 [报告]
发表于 2011-08-08 11:21 |显示全部楼层
本帖最后由 hq8318 于 2011-08-08 11:25 编辑

哈希表、有序图在存入值时,也要判断key是否相同,找到那个key,就保存,无就新建。只不过是这些已封装好,不用理,当然已优化好了。如不用高级类型,我只想到一算法:排序,再遍历--比较相邻两数是否相等,等就是那个了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2011-08-14 22:33 |显示全部楼层
回复 35# mirnshi

网上查到------
    Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。
  这题判断时要求100%正确,不适用吧。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2011-08-15 14:14 |显示全部楼层
“如果必须是100%,可以在冲突后,再进行循环检索”,这样就不是“小case,用bloom filter轻松搞定”吧。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
5 [报告]
发表于 2011-08-16 01:20 |显示全部楼层
本帖最后由 hq8318 于 2011-08-16 01:28 编辑

  CSDN更多人讨论,原来这题是指“题目 意思:我这里每个数字都是一个阿拉伯数字 是1位的 是 1到9之间的 但是有1百万个这样的数字 比如 12345678912 是11个这样的数字”。
  我思路大概是:当数字出现3次直接忽略,8个数字出现3次时结束。
  用图m 保存数字出现的次数,出现3次的保存到一集合hs,并从m 中移出。集合hs有的数字,不用比较了,直接跳到下一个,当集合hs有8个数字时,输出结果。最后是当hs达不到8个数字时,找到只出现两次的数字,输出,由于集合无indexOf,只有用一循环。

  1. import java.util.*;
  2. public class million
  3. {
  4.   public static void main(String args[])
  5.     {
  6.           int[] n={1,2,3,3,4,5,6,7,8,9,3,1,5,6,5,6,3,7,8,9,7,8,9,2,2,4,4};
  7.           // int[] n={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,1,5,6,7,8,9};
  8.           // int[] n={1,2,3,4,5,6,7,8,9,1,2,2,2};
  9.           Map<Integer,Integer> m=new HashMap<Integer,Integer>();
  10.           Set<Integer> hs=new HashSet<Integer>();
  11.           Integer v;
  12.           for(int n1:n){                    
  13.                     if(hs.contains(n1)) continue;
  14.                     v=m.get(n1);
  15.                     if(v==null)
  16.                                 m.put(n1,1);
  17.                     else if(v==1)
  18.                                 m.put(n1,v+1);
  19.                     else if(v==2){
  20.                                 hs.add(n1);                                
  21.                                 m.remove(n1);
  22.                                 if(hs.size()==8){
  23.                                           for(int i=1;i<10;i++){
  24.                                                     if(!hs.contains(i)) System.out.println(i);
  25.                                           }
  26.                                           break;
  27.                                 }
  28.                     }
  29.           }
  30.           if(hs.size()<8){
  31.                     for(Integer k:m.keySet()){
  32.                                 if(m.get(k)==2)
  33.                                           System.out.println(k);
  34.                     }
  35.           }
  36.           System.out.println(m);
  37.           System.out.print(hs);
  38.     }
  39. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP