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没有同或运算符

如果文章存在问题或者有更好的题解,欢迎评论区斧正和评论,各自努力,你我最高处见
posted @ 2021-05-06 09:06  21岁还不是架构师  阅读(54)  评论(0编辑  收藏  举报