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的牛人们表示深深的膜拜。












请问个问题啊,在c中如何实现对c语句文件(任何形式,可以是.c也可以是.txt)扫描功能呀?
目的是辨认出运算符,比如||,&&,+,-,*,/
并进行替换。
困惑好几个月的问题。。。我在网上也没有找到语句扫描的c,只有端口扫描的。。。。
欢迎与我联系:msn:ayahmy@hotmail.com
感谢Matrix67的介绍:-)
顺便给一个这个问题的(一种可能的)启发式解题过程分析,免得朋友们查找:
http://groups.google.com/group/pongba/browse_frm/thread/76b57a772b5ca091#
有兴趣与解题思维分析的朋友可以讨论讨论:)
赞~
楼上上上: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)。
不知道对不对?
汗,楼上都说了算法了。。我晚了。。
http://zhidao.baidu.com/question/58292539.html
麻烦看看这个- -
[...] http://www.matrix67.com/blog/archives/456 http://www.matrix67.com/blog/archives/511 Posted in Brain Storm Tags: 算法, 趣题, 位运算Trackback: [...]
[...] 我第一想到的算法题是那道经典问题:n个数中有且仅有一个数出现了奇数次(其它数都出现了偶数次),如何用线性时间常数空间找出这个数。解法也只有一句话:从头到尾异或一遍,结果就是要求的那个数。该问题的加强版也异常牛B,我曾经在这里介绍过。不过,这个算法我在茶余饭后已经聊过无数次了…… [...]
在所有m×n的扫雷格局中,求数字和最大的那一局?