Skip to content

Files

Latest commit

fa73a73 · Jan 16, 2024

History

History
154 lines (115 loc) · 4.03 KB

File metadata and controls

154 lines (115 loc) · 4.03 KB

English Version

题目描述

下标从 0 开始、长度为 n 的数组 derived 是由同样长度为 n 的原始 二进制数组 original 通过计算相邻值的 按位异或(⊕)派生而来。

特别地,对于范围 [0, n - 1] 内的每个下标 i

  • 如果 i = n - 1 ,那么 derived[i] = original[i] ⊕ original[0]
  • 否则 derived[i] = original[i] ⊕ original[i + 1]

给你一个数组 derived ,请判断是否存在一个能够派生得到 derived有效原始二进制数组 original

如果存在满足要求的原始二进制数组,返回 true ;否则,返回 false

  • 二进制数组是仅由 01 组成的数组。

 

示例 1:

输入:derived = [1,1,0]
输出:true
解释:能够派生得到 [1,1,0] 的有效原始二进制数组是 [0,1,0] :
derived[0] = original[0] ⊕ original[1] = 0 ⊕ 1 = 1 
derived[1] = original[1] ⊕ original[2] = 1 ⊕ 0 = 1
derived[2] = original[2] ⊕ original[0] = 0 ⊕ 0 = 0

示例 2:

输入:derived = [1,1]
输出:true
解释:能够派生得到 [1,1] 的有效原始二进制数组是 [0,1] :
derived[0] = original[0] ⊕ original[1] = 1
derived[1] = original[1] ⊕ original[0] = 1

示例 3:

输入:derived = [1,0]
输出:false
解释:不存在能够派生得到 [1,0] 的有效原始二进制数组。

 

提示:

  • n == derived.length
  • 1 <= n <= 105
  • derived 中的值不是 0 就是 1

解法

方法一:位运算

我们不妨假设原始二进制数组为 a ,派生数组为 b ,那么有:

b 0 = a 0 a 1 b 1 = a 1 a 2 b n 1 = a n 1 a 0

由于异或运算满足交换律和结合律,因此有:

b 0 b 1 b n 1 = ( a 0 a 1 ) ( a 1 a 2 ) ( a n 1 a 0 ) = 0

因此,只要派生数组的所有元素的异或和为 0 ,就一定存在一个满足要求的原始二进制数组。

时间复杂度 O ( n ) ,其中 n 为数组长度。空间复杂度 O ( 1 )

class Solution:
    def doesValidArrayExist(self, derived: List[int]) -> bool:
        return reduce(xor, derived) == 0
class Solution {
    public boolean doesValidArrayExist(int[] derived) {
        int s = 0;
        for (int x : derived) {
            s ^= x;
        }
        return s == 0;
    }
}
class Solution {
public:
    bool doesValidArrayExist(vector<int>& derived) {
        int s = 0;
        for (int x : derived) {
            s ^= x;
        }
        return s == 0;
    }
};
func doesValidArrayExist(derived []int) bool {
	s := 0
	for _, x := range derived {
		s ^= x
	}
	return s == 0
}
function doesValidArrayExist(derived: number[]): boolean {
    let s = 0;
    for (const x of derived) {
        s ^= x;
    }
    return s === 0;
}

方法二

function doesValidArrayExist(derived: number[]): boolean {
    return derived.reduce((acc, x) => acc ^ x, 0) === 0;
}