AI毛毛的blog

leetcode打卡-1720解码异或后的数组

五一这几天玩的有点嗨,今天看书脑子嗡嗡的,还是先整点简单题适应一下学习节奏好了。

题目描述

未知整数数组arr由n个非负整数组成。

经编码后变为长度为n - 1的另一个整数数组encoded ,其中encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1]经编码后得到encoded = [1,2,3]

给你编码后的数组encoded和原数组arr的第一个元素first(arr[0])

请解码返回原数组arr。可以证明答案存在并且是唯一的。

示例:

输入:encoded = [6,2,7,3], first = 4

输出:[4,2,0,7,4]

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/decode-xored-array

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

1. 位运算性质计算

异或满足交换律和结合律,对原式进行计算可得:

  • arr[i] ^ arr[i + 1] = encoded[i]
  • arr[i] ^ arr[i + 1] ^ encoded[i] = encoded[i] ^ encoded[i] = 0
  • arr[i] ^ arr[i + 1] ^ arr[i + 1] ^ encoded[i] = 0 ^ arr[i + 1]
  • arr[i] ^ encoded[i] = arr[i + 1]

所以遍历encoded数组即可迭代算出完整的arr数组.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def decode(self, encoded: List[int], first: int) -> List[int]:
# arr[i] ^ arr[i + 1] = encoded[i],用异或的性质运算得出
# arr[i + 1] = arr[i] ^ encoded[i]
length = len(encoded)
arr = [0] * (length + 1)
arr[0] = first

for i in range(length):
arr[i + 1] = arr[i] ^ encoded[i]

return arr

练习一下Rust实现

1
2
3
4
5
6
7
8
9
10
impl Solution {
pub fn decode(encoded: Vec<i32>, first: i32) -> Vec<i32> {
let len = encoded.len();
let mut arr = vec![first; len + 1];
for i in 0..len {
arr[i + 1] = encoded[i] ^ arr[i];
}
arr
}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

总结

几种位运算的基本规则要记牢。