winxos
发表于 2009-9-29 09:48:31
**** Hidden Message *****
winxos
发表于 2009-9-29 09:53:00
这题就是充分利用异或具有交换律和结合率的特性。
比如有:a XOR b XOR c = b XORa XOR a = b XOR ( a XOR a ) = b
XOR 在 C 里就是“^”运算符,不依赖第三方库,也无需新写函数。
gxqcn 发表于 2009-9-28 13:55 http://bbs.emath.ac.cn/images/common/back.gif
异或的方法确实很巧妙,不过异或跟我ls的统计速度应该差不多吧? ++ 运算应该比 ^ 还要快一点?
gxqcn
发表于 2009-9-29 10:04:27
相反,我认为 ^ 绝不比 ++ 慢(用汇编时,我比较喜欢用 xor 指令,替代 sub/add 指令)。
况且,要进行数组元素的索引,效率肯定比直接变量要慢一拍的。
还有,这里是一大批整数,每个数可以很大(可以是多位数),要统计的是数重复次数,而非单个位上的数字。
winxos
发表于 2009-9-29 10:13:43
相反,我认为 ^ 绝不比 ++ 慢(用汇编时,我比较喜欢用 xor 指令,替代 sub/add 指令)。
况且,要进行数组元素的索引,效率肯定比直接变量要慢一拍的。
还有,这里是一大批整数,每个数可以很大(可以是多位数 ...
gxqcn 发表于 2009-9-29 10:04 http://bbs.emath.ac.cn/images/common/back.gif
哦,我理解错题目意思了,以为都是一位的呢。但是如果是多位数的话,仍然要不同数字那么多内存啊,具体的异或代码是如何执行的呢?数组?下标如何换算呢?
gxqcn
发表于 2009-9-29 10:29:00
令一个变量初始化为0,
然后与数组中的数 ^= 运算一遍,
所得的最终结果即为所求。
遍历一遍即可,无须另开数组。
上述算法还有一个优点,可以任意分割任务进行并行处理。
winxos
发表于 2009-9-29 18:44:50
25# gxqcn
哦,关键是
重复次数最多的为一个奇数,其余的次数均为偶数
这个条件好苛刻,没看到其余都是偶数。
1.618
发表于 2009-10-1 23:25:11
抛砖引玉下:
#python代码
a = raw_input().split(',')
dist = {}
for x in a:
if xnot in dist.keys():
dist = True
else:
dist^= True
print dist
wayne
发表于 2009-10-10 16:36:35
呵呵,要是用Mathematica的话,只需一个函数:Commonest
kungfucop
发表于 2010-2-20 14:48:48
dame it
keeya0416
发表于 2010-3-17 15:15:34
感觉想脑筋急转弯哦