1734-解码异或后的排列

题目

1734. 解码异或后的排列 - 力扣(LeetCode) (leetcode-cn.com)

思路

该题目初看同1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)类似,实际上,1720中直接给出了原数组的第一个数,因此很简单,而本题的难点就在于如何求出原数组的第一个数。

根据题目描述,我们可以知道原数组是从1n的正整数的排列,即原数组所有元素的异或结果为1 ^ 2 ... ^ n(异或运算满足交换律)。另外,异或运算的特点x ^ x = 0,如果我们能求出原数组中从第二个数到最后一个数的异或结果perm[1] ^ perm[2] ...^ perm[n-1],则能够求出原数组第一个数。

根据题目描述,有encode[i] = perm[i] ^ perm[i + 1],可以通过求encode[1] ^ encode[3] ^ encode[5] ... ^ encode[n-2]来求perm[1] ^ perm[2] ...^ perm[n-1],因此我们就能够求出原数组的第一个数了。

上述求解方法需要保证n-2是奇数,因此当n为偶数(n-1)为奇数时,我们则无法通过encode求出perm[1] ^ perm[2] ...^ perm[n-1]

代码

class Solution {
public:
    vector<int> decode(vector<int>& encoded) {
        int m = encoded.size() + 1;
        int t = 0;
        int s = 0;
        for(int i=1; i<=m; i++) {
            t ^= i;
        }

        for(int i=1; i<m-1; i+=2) {
            s ^= encoded[i];
        }

        s ^= t;
        vector<int> r(m);
        r[0] = s;
        for(int i=0;i<m-1;i++) {
            s ^= encoded[i];
            r[i+1] = s;
        }
        return r;
    }
};

相关题目

1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值