标签:arr Java int 1720 异或 数组 encoded first
题目描述
题干:
未知 整数数组 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没有同或运算符
如果文章存在问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见
标签:arr,Java,int,1720,异或,数组,encoded,first 来源: https://www.cnblogs.com/bc-song/p/14733791.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。