【LeetCode/力扣】1734. 解码异或后的排列

1 题目描述

题目连接:https://leetcode-cn.com/problems/decode-xored-permutation/


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

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

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


示例 1:

输入:encoded = [3,1]
输出:[1,2,3]
解释:如果 perm = [1,2,3] ,那么 encoded = [1 XOR 2,2 XOR 3] = [3,1]
示例 2:

输入:encoded = [6,5,4,6]
输出:[2,4,1,5,3]

2 解题思路

  • 异或问题是算法中常见的一类,异或运算是位运算的一种,相同得0,不同得1
  • 本题的关键是确定出perm[0],然后根据perm[i+1] = perm[i] ^ encodedp[i]即可得到结果
  • 题干中两个关键信息,一是perm是前 n 个正整数的排列(乱序),二是包含奇数个元素
  • 根据第一关键信息,可以得到perm中所有数的异或结果,从1到n进行异或即可
  • 根据第二关键信息,可以得到perm中除了perm[0]之外所有数的异或结果,原因是:
encoded[0] = perm[0] ^ perm[1] 
encoded[1] = perm[1] ^ perm[2]
encoded[2] = perm[2] ^ perm[3] 
encoded[3] = perm[3] ^ perm[4]
// 观察上式中,encoded[1]、encede[3]……包含了perm[1]、perm[2]、perm[3]、perm[4]…
  • 根据【perm中所有数的异或结果】和【除了perm[0]之外所有数的异或结果】可得到perm[0]

3 代码/C++

class Solution {
public:
    vector<int> decode(vector<int>& encoded) {
        // 得到perm长度
        int n = encoded.size()+1;
        // 得到【perm中所有数的异或结果】
        int total = 0;
        for(int i=1; i<=n; i++){
            total ^= i;
        }
        // 得到【除了perm[0]之外所有数的异或结果】
        int odd = 0;
        for (int i=1; i<n-1; i+=2){
            odd ^= encoded[i];
        }
        vector<int> perm(n);
        // 得到perm[0]
        perm[0] = total ^ odd;
        // 得到perm所有数
        for (int i=0; i<n-1; i++){
            perm[i+1] = perm[i]^encoded[i];
        }
        return perm;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值