找回密码
 欢迎注册
楼主: gxqcn

[擂台] 快速找出奇数次数的数

[复制链接]
发表于 2009-9-29 09:48:31 | 显示全部楼层
游客,如果您要查看本帖隐藏内容请回复
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-29 09:53:00 | 显示全部楼层
这题就是充分利用异或具有交换律和结合率的特性。

比如有:a XOR b XOR c = b XOR  a XOR a = b XOR ( a XOR a ) = b

XOR 在 C 里就是“^”运算符,不依赖第三方库,也无需新写函数。
gxqcn 发表于 2009-9-28 13:55

异或的方法确实很巧妙,不过异或跟我ls的统计速度应该差不多吧? ++ 运算应该比 ^ 还要快一点?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-9-29 10:04:27 | 显示全部楼层
相反,我认为 ^ 绝不比 ++ 慢(用汇编时,我比较喜欢用 xor 指令,替代 sub/add 指令)。

况且,要进行数组元素的索引,效率肯定比直接变量要慢一拍的。

还有,这里是一大批整数,每个数可以很大(可以是多位数),要统计的是数重复次数,而非单个位上的数字。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-29 10:13:43 | 显示全部楼层
相反,我认为 ^ 绝不比 ++ 慢(用汇编时,我比较喜欢用 xor 指令,替代 sub/add 指令)。

况且,要进行数组元素的索引,效率肯定比直接变量要慢一拍的。

还有,这里是一大批整数,每个数可以很大(可以是多位数 ...
gxqcn 发表于 2009-9-29 10:04

哦,我理解错题目意思了,以为都是一位的呢。但是如果是多位数的话,仍然要不同数字那么多内存啊,具体的异或代码是如何执行的呢?数组?下标如何换算呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-9-29 10:29:00 | 显示全部楼层
令一个变量初始化为0,
然后与数组中的数 ^= 运算一遍,
所得的最终结果即为所求。

遍历一遍即可,无须另开数组。

上述算法还有一个优点,可以任意分割任务进行并行处理。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-29 18:44:50 | 显示全部楼层
25# gxqcn
哦,关键是
重复次数最多的为一个奇数,其余的次数均为偶数
这个条件好苛刻,没看到其余都是偶数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-1 23:25:11 | 显示全部楼层
抛砖引玉下:
#python代码

a = raw_input().split(',')
dist = {}
for x in a:
    if x  not in dist.keys():
        dist[x] = True
    else:
        dist[x]^= True


print dist
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-10-10 16:36:35 | 显示全部楼层
呵呵,要是用Mathematica的话,只需一个函数:Commonest
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-2-20 14:48:48 | 显示全部楼层
dame it
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-3-17 15:15:34 | 显示全部楼层
感觉想脑筋急转弯哦
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-25 15:10 , Processed in 0.043167 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表