這個題不用位運算也可以解決。當然爲了鞏固位運算,我學習了這個。
首先需要了解一下不進位加法。
大體思路:
先將所有的數轉換爲k進制的數字,然後做不進位的加法,最後就剩下出現一次的k進制數,然後再將剩下的k進制數轉換成十進制數
public class 出現k次 {
public static void main(String[] args) {
int[] arr={2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};
int len = arr.length;
char[][] KRadix = new char[len][]; //字符二維數組存取每一個數的三進制的每一位
int k =3;
//記錄轉成k進制數的最長位數,用來看最後需要計算多少列
int maxLen = 0;
//轉成k進制數字
//對於每個數字
for(int i = 0;i<len;i++)
{
//求每個數字的三進制字符串並反轉,然後轉爲字符數組 目的的將每個k進制數的低位對齊(因爲轉成k進制數的位數不同)
KRadix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
if(KRadix[i].length > maxLen)
{
maxLen = KRadix[i].length;
}
}
//存放做完不進位加法每一位和
int[] resArr=new int[maxLen];
//做不進位加法
for(int i = 0;i<len;i++)
{
//不進位加法
for(int j = 0;j<maxLen;j++)
{
//如果j大於等於當前數組長度的話,就需要補0
if(j >=KRadix[i].length)
{
resArr[j]+=0;
}else
{
resArr[j] += (KRadix[i][j]-'0');
}
}
}
int res = 0;
for(int i = 0;i<maxLen;i++)
{
res+=(resArr[i]%k)*(int)(Math.pow(k, i));
}
System.out.println(res);
}
}