leetcode-1734 解碼異或後的排列
阿新 • • 發佈:2021-10-16
leetcode-1734 解碼異或後的排列
解題思路
- 異或運算特性
- encode陣列長度為n-1,則perm陣列長度為n
perm=[1,2,3,......,n]的排列 - 假設perm=[A,B,C,D,E],encode=[F,G,H,I],n為奇數
\(A\bigoplus B=F \ \ \ B\bigoplus C=G\ \ \ C\bigoplus D=H \ \ \ D\bigoplus E=I\)
\(A\bigoplus B\bigoplus C\bigoplus D\bigoplus E=A\bigoplus (B\bigoplus C)\bigoplus (D\bigoplus E)\)
\(encode=[F,G,H,I]=[A\bigoplus B,B\bigoplus C,C\bigoplus D,D\bigoplus E]\)
\(A=A\bigoplus (B\bigoplus C)\bigoplus (D\bigoplus E)\ \ \bigoplus \ \ \ (B\bigoplus C)\bigoplus (D\bigoplus E)\)
因為n為奇數,所以可以從1開始,後每面兩個元素的異或值,可以求出perm陣列的第一個元素,剩餘步驟同leetcode1720一致
程式碼
class Solution: def decode(self, encoded): ABCDE=0 n=len(encoded)+1 for i in range(1,n+1): ABCDE^=i i=1 BCDE=0 while i<n: BCDE^=encoded[i] i+=2 perm=[0]*n perm[0]=ABCDE^BCDE for i in range(1,n): perm[i]=perm[i-1]^encoded[i-1] return perm