题目链接:1720. 解码异或后的数组(简单)
算法原理:
解法:位运算-异或消消乐
1ms击败100.00%
时间复杂度O(N)
思路很简单,根据“异或消消乐”的原理:a^a=0
用ai表示原始中数组的第i个数⬇️
由于encoded[0]=a1^a2,因此此题中原始的a2=encoded[0]^first=a1^a2^a1=a2
类似的,我们可以递推推导出其余数
JAVA代码:
class Solution { //1720. 解码异或后的数组 public int[] decode(int[] encoded, int first) { //异或消消乐 int n=encoded.length; int[] ret=new int[n+1]; ret[0]=first; for(int i=1;i<n+1;i++) ret[i]=encoded[i-1]^ret[i-1]; return ret; } }题目链接:2433. 找出前缀异或的原始数组(中等)
算法原理:
解法:位运算-异或消消乐
2ms击败66.25%
时间复杂度O(N)
观察题述中的规律,拿示例一举例⬇️
pref[0]=5,因此ret[0]=5
pref[1]=5^7=2,因此ret[1]=pref[0]^pref[1]=(5)^(5)^7=7
pref[2]=5^7^2=0,因此ret[2]=pref[1]^pref[2]==(5^7)^(5^7)^2=2
pref[3]=5^7^2^3=3,因此ret[3]=pref[2]^pref[3]=(5^7^2)^(5^7^2)^3=3
pref[4]=5^7^2^3^2=1,因此ret[4]=pref[3]^pref[4]=(5^7^2^3)^(5^7^2^3)^2=2
因此ret[i]=pref[i-1]^pref[i]
JAVA代码:
class Solution { //2433. 找出前缀异或的原始数组 public int[] findArray(int[] pref) { int n=pref.length; int[] ret=new int[n]; ret[0]=pref[0]; for(int i=1;i<n;i++) ret[i]=pref[i-1]^pref[i]; return ret; } }题目链接:2683. 相邻值的按位异或(中等)
算法原理:
解法:脑筋急转弯+异或消消乐
2ms击败100.00%
时间复杂度O(N)
可能很多小伙伴都会去想怎么模拟这个过程,但其实根本没必要
我们观察示例1能够发现,如果这个原始数组真的存在,那么derived数组中所有值异或在一起的值为original[0]^original[1]^^original[1]^original[2]^original[2]^original[0]=0,如果不存在则必然结果不为0,因此我们仅需将derived数组中所以数异或在一起,判断最终结果是否为0即可
JAVA代码:
class Solution { //2683. 相邻值的按位异或 public boolean doesValidArrayExist(int[] derived) { int ret=0; for(int x:derived) ret^=x; return ret==0; } }