1734. 解码异或后的排列-每日一题

一、题目

       给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。

       它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。

       给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。

点击查看原题

二、思路

       由于给出的是已经进行加密数组,且不给第一个或最后一个数字,那么就需要自己去求解第一个或最后一个数字:
(这里有个很不容易理解的地方,“它是前 n 个正整数的排列”指就是1-n的数字的随机排列,包含了{1,2,…,n})
       根据异或操作,对于任意数字num,有num^num=0,num^0=num,偶数个数字进行了异或操作,就可以消除该数字。可以利用这一特性来对其他元素进行消除。其实可以设定xor1ToN为perm[1]^perm[2]…perm[n],设定xor0ToN为perm[0]^perm[1]…perm[n],然后perm[0]=xor1ToN^xor0ToN。
       使用encoded代替perm,可以得到:
              xor1ToN=perm[1]^perm[2]…perm[n]=encoded[1]^encoded[3]…encoded[n]
              xor0ToN=1^2^…^n

三、代码

class Solution {
    public int[] decode(int[] encoded) {
        int[] ans = new int[encoded.length + 1];
        int xor1ToN = 0, xor0ToN = 0;
        for (int i = 1; i < encoded.length; i+=2) {
            xor1ToN ^= encoded[i];
        }
        for (int i = 1; i <= encoded.length+1; i++) {
            xor0ToN ^= i;
        }
        ans[0] = xor0ToN ^ xor1ToN;
        for (int i = 0; i < encoded.length; i++) {
            ans[i+1] = ans[i] ^ encoded[i];
        }
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佳鑫大大

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值