1720. 解码异或后的数组

川长思鸟来 2023-01-18 14:26 273阅读 0赞

困难题我唯唯诺诺,简单题我重拳出击

在这里插入图片描述
题目看着有点复杂,简单解释就是通过给出的公式
encoded[i] = arr[i] XOR arr[i + 1],arr数组,其中encoded[] 为已知,arr[0] 为已知,算出arr[]。其实所以我们要推导出arr[i] = ?? 这么一个公式。

在推导前我们先复习一下异或的相关特点:

  1. 相同数值异或,结果为 0

    x ^ x = 0

  2. 任意数值与 0 进行异或,结果为数值本身

    x ^ 0 = x

  3. 异或本身满足交换律

    a ^ b = b ^ a

更具上面的三个特征我们在根据encoded[i-1] = arr[i-1] XOR arr[i]进行推导

  1. 首先将等式两边同时加上异或arr[i-1],则等式变为如下

    encoded[i-1] XOR arr[i-1] = arr[i-1] XOR arr[i] XOR arr[i-1]

  2. 由性质3得

    encoded[i-1] XOR arr[i-1] = arr[i-1] XOR arr[i-1] XOR arr[i]

  3. 由性质1知

    encoded[i-1] XOR arr[i-1] = 0 XOR arr[i]

  4. 由性质二知

    arr[i] = encoded[i-1] XOR arr[i-1]

至此推导出了我们想要的公式:arr[i] = encoded[i-1] XOR arr[i-1]

实现代码如下:

  1. public int[] decode(int[] encoded, int first) {
  2. int n = encoded.length + 1;
  3. int[] ans = new int[n];
  4. ans[0] = first;
  5. for (int i = 1; i < n; i++) {
  6. ans[i] = ans[i - 1] ^ encoded[i - 1];
  7. }
  8. return ans;
  9. }
  • 时间复杂度: O(n), n 为encode数组的长度
  • 空间复杂度: O(n), 返回的结果数组也算的话
  • 参考

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读