題目
給定一個整型數組arr和一個大于1的整數k。已知arr中只有1個數出現了1次,其他的數都出現了k次,請返回只出現了1次的數。
解答:
對此題進行思路轉換,可以將此題,轉換成k進制數。
k進制的兩個數c和d,在i位上無進位相加的結果就是(c(i) + d(i) )% k。那么,如果k個相同的k進制進行無進位相加,相加的結果一定是沒一位上都是0的k進制數。
首先設置一個變量eO,它是一個32位的k進制數,且每個位置上都是0。然后遍歷arr,把遍歷到的每一個整數都轉換為k進制數,然后與eO進行無進位相加。遍歷結束時,把32位的k進制數eORes轉換為十進制整數,就是我們想要的結果。因為k個相同的k進制數無進位相加,結果一定是每一位上都是0的k進制數,所以只出現一次的那個數最終就會剩下來。
public int onceNum(int[] arr, int k ){int[] eO = new int[32];for(int i = 0;i != arr.length;i++){setExclsiveOr(eO,arr[i],k); }int res = getNumFromKSysNum(eO,k);
}public void setExclusiverOr(int[] eO,int value,int k){int[] curKSysNum = getKSysNumFromNum(value,k);for(int i = 0;i!= eO.length;i++){eO[i] = (eO[i] + curKSysNum[i]) % k;}
}public int[] getKSysNumFromNum(int value,int k){int[] res = new int[32];int index = 0;while(value != 0 ){res[index++] = value % k;value = value/k;}return res;
}public int getNumFromKSysNum(int[] eO,int k){int res = 0;for(int i = eO.length - 1;i != -1; i--){res = res * k + eO[i];}return res;
}