侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 674 篇文章
  • 累计创建 128 个标签
  • 累计收到 20 条评论

目 录CONTENT

文章目录

【位运算, 差分】找出前缀异或的原始数组【力扣第 314 场周赛】

GabrielxD
2022-10-09 / 0 评论 / 0 点赞 / 152 阅读 / 333 字
温馨提示:
本文最后更新于 2022-10-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

6201. 找出前缀异或的原始数组


给你一个长度为 n整数 数组 pref 。找出并返回满足下述条件且长度为 n 的数组 arr

  • pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i].

注意 ^ 表示 按位异或(bitwise-xor)运算。

可以证明答案是 唯一 的。

示例 1:

输入:pref = [5,2,0,3,1]
输出:[5,7,2,3,2]
解释:从数组 [5,7,2,3,2] 可以得到如下结果:
- pref[0] = 5
- pref[1] = 5 ^ 7 = 2
- pref[2] = 5 ^ 7 ^ 2 = 0
- pref[3] = 5 ^ 7 ^ 2 ^ 3 = 3
- pref[4] = 5 ^ 7 ^ 2 ^ 3 ^ 2 = 1

示例 2:

输入:pref = [13]
输出:[13]
解释:pref[0] = arr[0] = 13

提示:

  • 1 <= pref.length <= 10^5
  • 0 <= pref[i] <= 10^6

解题

方法一:差分思想 位运算

思路

本题类似于给出前缀和数组让还原原数组,可以利用差分的思想来做,而异或运算的逆运算是它本身(自反性:pqq=p0=pp \oplus q \oplus q = p \oplus 0 = p),所以:origin[i] = pref[i] ^ pref[i - 1]

代码

class Solution {
    public int[] findArray(int[] pref) {
        int n = pref.length;
        int[] origin = new int[n];
        origin[0] = pref[0];
        for (int i = 1; i < n; ++i) {
            origin[i] = pref[i] ^ pref[i - 1];
        }
        return origin;
    }
}
0

评论区