You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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(&:^) 能找出唯一不重复的数?

这完全依赖异或运算的三个核心特性:

  • 任何数和自身异或结果为0x ^ x = 0
  • 任何数和0异或结果为自身x ^ 0 = x
  • 异或运算满足交换律和结合律a ^ b ^ c = a ^ c ^ b = (a ^ b) ^ c

回到你的题目场景:数组中除了一个数只出现一次,其余所有数都出现两次。当我们把数组里所有数依次做异或运算时:

  1. 每一对重复出现的数异或后都会变成0
  2. 最终剩下的就是那个唯一数和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

火山引擎 最新活动