Leetcode——1720. 解码异或后的数组(Java)
题目描述
题干:
未知 整数数组 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]
题解思路
返回异或前的数组,这种关于位运算的问题,逃不过以下这几个运算规律
我们只需要搞清它的运算规律,这类题就迎刃而解了
-
异或运算满足交换律和结合律;
-
任意整数和自身做异或运算的结果都等于 0,即 x⊕x=0;
-
任意整数和 0 做异或运算的结果都等于其自身,即 x⊕0=0⊕x=x。
如果我们把异或后的数组和之前的数组的第一位相互异或,因为相当于第一位和本身异或
这样就变成了第二位和0异或,这样就得到原数组的第二位,这样一次迭代即可
正确代码
public int[] decode(int[] encoded, int first) {
//定义新的返回数组
int length = encoded.length + 1;
int[] arr = new int[length];
//任何数和他自己异或都为0
//任何数和0异或都为它本身
//根据这个特性让encoded数字和first依次异或即可得到原来的数组
arr[0] = first;
for (int i = 1; i < length; i++) {
arr[i] = encoded[i - 1] ^ arr[i - 1];
}
return arr;
}
总结
掌握好位运算的公式和规律才是制胜这类题的关键,值得注意的是Java没有同或运算符
如果文章存在问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见