趣题:寻找出现了奇数次的数
icon2 Program Impossible | icon4 2008-05-12 12:31| icon310 Comments | 本文内容遵从CC版权协议 转载请注明出自matrix67.com

1. 给你n个数,其中有且仅有一个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那一个数。
2. 给你n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那两个数。

 
 

1. 从头到尾异或一遍,最后得到的那个数就是出现了奇数次的数。这是因为异或有一个神奇的性质:两次异或同一个数,结果不变。再考虑到异或运算满足交换律,先异或和后异或都是一样的,因此这个算法显然正确。

2. 从头到尾异或一遍,你就得到了需要求的两个数异或后的值。这两个数显然不相等,异或出来的结果不为0。我们可以据此找出两个数的二进制表达中不同的一位,然后把所有这n个数分成两类,在那一位上是0的分成一类,在那一位上是1的分到另一类。对每一类分别使用前一个问题的算法。

题目来源:http://groups.google.com/group/pongba/browse_frm/thread/f4a080edbe3ce0e1


    来自TopLanguage的朋友们,你们好!!
    经常看网站的来路分析是一件很有意义的事情。很多牛B东西都是我在回访来路时找到的。牛人Pongba从03年开始就在CSDN上写Blog,每一篇文章都是经典的原创牛文,访问量巨大无比。他在Google Groups里建了一个group叫做TopLanguage,里边真是牛人如云。如果你对程序设计一类的东西感兴趣,你会喜欢这个group的。
    向Pongda和TopLanguage的牛人们表示深深的膜拜。

10 条回复

  • 楼层: 沙发 | | Jolie 说:

    请问个问题啊,在c中如何实现对c语句文件(任何形式,可以是.c也可以是.txt)扫描功能呀?
    目的是辨认出运算符,比如||,&&,+,-,*,/
    并进行替换。

    困惑好几个月的问题。。。我在网上也没有找到语句扫描的c,只有端口扫描的。。。。
    欢迎与我联系:msn:ayahmy@hotmail.com

  • 楼层: 板凳 | | pongba 说:

    感谢Matrix67的介绍:-)

    顺便给一个这个问题的(一种可能的)启发式解题过程分析,免得朋友们查找:
    http://groups.google.com/group/pongba/browse_frm/thread/76b57a772b5ca091#
    有兴趣与解题思维分析的朋友可以讨论讨论:)

  • 楼层: 地毯 | | Jason911 说:

    赞~

  • 楼层: 地板 | | cosechy 说:

    楼上上上:c是纯编译的语言所以应该没有直接的办法。办法是,调用c编译器每次都编译一下或者复制一下c或者类似语言的代码。当然要不是运行的时候干这事的话#include就可以了

  • 楼层: 地下室 | | 呵呵 说:

    对不对呢?对就给个留言吧

    1.全部异或,得到的就是答案

    2.分治法,1*先保证数据随机化(随机打乱O(n))
    2*选定x,所有比x小的在左面,大的在右面O(n)
    3*左面的全部异或得p,右面的全部异或得q O(n)
    4*如果p0,q0,p,q就是答案,输出
    如果p=0那么在得到q的那半继续执行以上算法

    时间复杂度分析T(n)=T(n/2)+O(n),
    Mater Theory告诉我们这个T(n)=O(n)。
    不知道对不对?

  • 楼层: 地基 | | 呵呵 说:

    汗,楼上都说了算法了。。我晚了。。

  • 楼层: 地壳 | | withmazijian29 说:

    http://zhidao.baidu.com/question/58292539.html

    麻烦看看这个- -

  • 楼层: 地幔 | | Matrix67: My Blog » Blog Archive » 趣题:寻找策略使得总有一人猜出他背上的数 说:

    [...] http://www.matrix67.com/blog/archives/456 http://www.matrix67.com/blog/archives/511 Posted in Brain Storm Tags: 算法, 趣题, 位运算Trackback: [...]

  • 楼层: 地核 | | Matrix67: My Blog » Blog Archive » (召集)你能想到的最奇妙的算法题是什么? 说:

    [...]     我第一想到的算法题是那道经典问题:n个数中有且仅有一个数出现了奇数次(其它数都出现了偶数次),如何用线性时间常数空间找出这个数。解法也只有一句话:从头到尾异或一遍,结果就是要求的那个数。该问题的加强版也异常牛B,我曾经在这里介绍过。不过,这个算法我在茶余饭后已经聊过无数次了…… [...]

  • 楼层: 10楼 | | 对酒当歌 说:

    在所有m×n的扫雷格局中,求数字和最大的那一局?

您也随便说几句吧:

请注意:如果您是第一次在本站发表评论,您的评论需要通过管理员的审核。

您可以在Gravatar设置您的头像。