CodeWars解题中Ruby reduce方法的:^符号含义咨询
理解Ruby中
^运算符在stray函数里的妙用 嘿,这个解法确实是个简洁又高效的技巧!让我一步步帮你拆解清楚:
首先,^ 在Ruby里的含义
在Ruby中,^ 是按位异或(XOR)运算符,它针对两个整数的二进制位做逐位运算,规则很简单:
- 如果对应位置的二进制位相同(都是0或都是1),结果为0
- 如果对应位置的二进制位不同(一个0一个1),结果为1
举几个直观的例子:
5 ^ 5 # 结果是0,二进制101 ^ 101 = 000 3 ^ 5 # 结果是6,二进制011 ^ 101 = 110(对应十进制6)
为什么 numbers.reduce(&:^) 能找出唯一不重复的数?
这完全依赖异或运算的三个核心特性:
- 任何数和自身异或结果为0:
x ^ x = 0 - 任何数和0异或结果为自身:
x ^ 0 = x - 异或运算满足交换律和结合律:
a ^ b ^ c = a ^ c ^ b = (a ^ b) ^ c
回到你的题目场景:数组中除了一个数只出现一次,其余所有数都出现两次。当我们把数组里所有数依次做异或运算时:
- 每一对重复出现的数异或后都会变成0
- 最终剩下的就是那个唯一数和0异或,结果就是它本身
举个实际的例子,比如数组 [2, 7, 2, 9, 9]:
2 ^ 7 ^ 2 ^ 9 ^ 9 = (2 ^ 2) ^ (9 ^ 9) ^ 7 = 0 ^ 0 ^ 7 = 7
刚好就是那个唯一不重复的数!
最后说说 reduce(&:^) 的写法
reduce(也可以用inject)是Ruby数组的累积迭代方法,用来把数组元素逐步合并计算。&:^ 是Ruby的语法糖,等价于传递块 {|accumulator, number| accumulator ^ number}。
简单来说,numbers.reduce(&:^) 会从数组第一个元素开始,依次和后续每个元素做异或运算,最终得到的累积结果就是那个唯一的不重复整数。
这种解法不仅代码简洁,时间复杂度是O(n),空间复杂度是O(1),效率拉满!
内容的提问来源于stack exchange,提问作者ollsop




