leetcode刷题笔记——1734、解码异或后的排列

本文详细探讨了LeetCode中关于解码异或后排列的问题。通过分析原数组与异或编码之间的关系,提出了解决方案。首先,通过异或运算找出原数组的第一个元素,然后利用异或的性质递推出其余元素。提供的代码实现了这一过程。
摘要由CSDN通过智能技术生成

题目:

在这里插入图片描述

思路:

假设原数组perm=[a,b,c,d,e],n=5;异或后编码数组encoded=[A,B,C,D]。
那么A=a^b B=b^c C=c^d D=d^e。
又因为perm是由前n个正整数构成的随机顺序的数组,则perm的全部元素异或结果是已知的,x=1^ 2 ^ 3 ^ 4 ^5 = perm[0]^ perm[1] ^ perm[2] ^ perm[3] ^perm[4].
其中perm[1] ^ perm[2]=B=encoded[1],perm[3] ^ perm[4]=D=encoded[3]
所以x=perm[0] ^ encoded[1] ^ encoded[3];
根据异或的性质可得:perm[0] = x ^ encoded[1] ^ encoded[3]
可以得到perm数组的第一个元素,那之后的元素就是一个递推的关系。

代码:

class Solution {
public:
    vector<int> decode(vector<int>& encoded) {
        int n = encoded.size()+1;
        vector<int> res(n);
        int x = 0;
        for(int i=1;i<=n;i++){
            x^=i;
        }
        for(int i=1;i<n;i+=2){
            x^=encoded[i];
        }
        res[0]=x;
        for(int i=0;i<n-1;i++){
            res[i+1]=res[i]^encoded[i];
        }
        return res;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值