LeetCode 1734. 解码异或后的排列(异或)

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

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

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

数据范围:
3 <= n < 1e5
n 是奇数。
encoded.length == n - 1
解法:
题目的特殊条件:
perm[]的长度n是奇数,且序列是排列.

那么:
encoded[]的长度是偶数,
encoded[0]=perm[0]^perm[1],
encoded[2]=perm[2]^perm[3],
....
encoded[n-3]=perm[n-3]^perm[n-2].
因此:
encoded[0]^encoded[2]^...encoded[n-3]=perm[0]^perm[1]^...perm[n-2],
设上式的结果为p
令temp=1^2^3....^n,那么temp^p=perm[n-1].
又因为encoded[n-2]=perm[n-2]^perm[n-1],
encoded[n-2]已知,perm[n-1]已知,那么可以退出perm[n-2],
同理可递推出perm[n-3],perm[n-4]...perm[0].
答案就出来了
code:
class Solution {
public:
    vector<int> decode(vector<int>& a) {
        int n=a.size();
        vector<int>ans(n+1);
        int temp=0;
        for(int i=1;i<=n+1;i++)temp^=i;
        for(int i=0;i<n;i+=2){
            temp^=a[i];
        }
        ans[n]=temp;
        for(int i=n-1;i>=0;i--){
            ans[i]=ans[i+1]^a[i];
        }
        return ans;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值