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 。可以证明答案存在并且是唯一的。
示例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中的,为什么7和4的异或等于3?这个是基于位运算,我们都知道异或表示的意思是不同为真。下图可以解释这一点。
-
这里是按位进行异或的,所以3和7的异或等于4。那么我们这里就容易发现,3和7的异或是4,同时,4和7的异或也等于3,3和4的异或等于7。也就是说,在异或的关系中,这三个变量是互相成立的。
-
懂了这一点,我们的代码就出现了
Java代码
/**
* @Description: 力扣1720题题解
* @return: 返回结果
* @Author: Mr.Gao
* @Date: 2021/5/6
*/
public int[] decode(int[] encoded, int first) {
int n = encoded.length;
int [] re = new int[n+1];
re[0] = first;
for (int i = 1; i <= n; i++) {
re[i] = re[i-1]^encoded[i-1];
}
return re;
}