1. 程式人生 > 其它 >leetcode-1734 解碼異或後的排列

leetcode-1734 解碼異或後的排列

leetcode-1734 解碼異或後的排列

解題思路

  1. 異或運算特性
\[a \bigoplus b=c\ \ \ \ \ \ c\bigoplus a=b \]
  1. encode陣列長度為n-1,則perm陣列長度為n
    perm=[1,2,3,......,n]的排列
  2. 假設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