未知 整数数组 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
。可以证明答案存在并且是唯一的。
示例 1:
输入:encoded = [1,2,3], first = 1
输出:[1,0,2,1]
解释:若 arr = [1,0,2,1] ,那么 first = 1 且 encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]
示例 2:
输入:encoded = [6,2,7,3], first = 4
输出:[4,2,0,7,4]
提示:
- 2 <=
n
<= 104 encoded.length
==n - 1
- 0 <=
encoded[i]
<= 105 - 0 <=
first
<= 105
思路
本题还是比较简单的,想清楚之后就很好做,其实就是一个倒推的过程。
看第一个样例:
1 XOR 0 = 1
0 XOR 2 = 2
2 XOR 1 = 3
题目给出的信息是[1, 2, 3]
以及左边的一个1
,因此,就需要倒推出XOR
右边的0
,然后再由0
和2
倒推出2
,再由2
和3
倒推出1
,就能得到答案[1, 0, 2, 1]
了。
这里有一个异或运算的知识:
若a^b = c,
则a = b^c(或b = a^c).
所以,要想倒推出XOR
右边的值,只需要将已知的两个数做异或即可(也就是b = a^c
这种情况)。
最后,因为上一次倒推出来的答案,下一次还要用到,所以还要设置一个pre
来记录前一次推出的答案。
代码
public class Solution {
ArrayList<Integer> list = new ArrayList<Integer>();
public int[] decode(int[] encoded, int first) {
list.add(first);
int pre = first;
for(int i=0;i<encoded.length;i++) {
int temp = pre^encoded[i];
list.add(temp);
pre = temp;
}
int[] answear = new int[list.size()];
for(int i=0;i<answear.length;i++) {
answear[i] = list.get(i);
}
return answear;
}
}