我用java刷 leetcode 1734. 解码异或后的排列

这里有leetcode题集分类整理!!!

(与 leetcode 1720 联动)
题目难度: 中等
题目描述:
给你一个整数数组 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]

提示:
3 <= n < 105
n 是奇数。
encoded.length == n - 1


解题:

关键数学公式:
1.如果a ^ b = c, 那么a ^ c = b, b ^ c = a
2. a ^ a = 0;

解题思路:
1.由题意可知,数组中为[1,encoded.length + 1],那么我们能算出从1到encoded.length + 1的异或结果total
2.由题意可知,encoded[i] = perm[i] ^ perm[i + 1],那么我们其实也就能根据这个公式算出perm除了某个位置之外的其他所有位置的异或和,在这里:

假设我们去求perm 0位置,那么我们只需要把perm原位置1到encoded.length + 1位置的全部异或了,就是除了0位置之外异或和,关键是这个该如何去计算?
其实只需要计算odd = encoded[1] ^ encoded[3] ^ encoded[5] ^ …… ^ encoded[encoded.length - 1],
因为根据题中公式能直接转换为odd = perm[1] ^ perm[2] ^ perm[3] ^ …… ^ perm[n - 1] ^ perm[n],
然后根据那个数学公式1,自己 ^ 自己 = 0,那么total ^ odd = perm[0];
3.求出一个位置后,用数学公式2去计算其他位置

AC:

class Solution {
    public int[] decode(int[] encoded) {
        int n = encoded.length;
        int[] res = new int[n + 1];
        int total = 1;
        int odd = encoded[1];
        for (int i = 2 ; i <= n + 1; i ++) total ^= i;
        for (int i = 3 ; i < n ; i += 2) odd ^= encoded[i];
        res[0] = total ^ odd;
        for (int i = 1 ; i < n + 1 ; i ++) res[i] = res[i - 1] ^ encoded[i - 1];
        return res;
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值