題目1:
數組中只有一個數出現了一次其他數均出現k次,求出出現一次的數
算法思想與代碼寫一起了,見註釋
public class 出現k次與1次 {
/*
* 【當k爲偶數奇數都適用】
* 算法思想:
* 1,把所有的數字轉化爲k進制
* 2,讓轉化後的數每一相同的位相加
* 3,每一位相加後的數除k取餘得到一個k進制的數
* 4,將該數轉化爲十進制即可輸出
*/
public static void main(String[] args) {
int [] arr={2,2,2,2,3,3,3,3,6,6,6,6,9,9,9,9,8,8,8,8,7,5,5,5,5};
int len=arr.length;
char[][] kradix=new char[len][];
int k=4;
int maxlen=0;
//轉成k進制字符數組
//對於每個數字
for(int i=0;i<len;i++){
//求每個數字的三進制字符串並且翻轉(爲了每一位對齊,這樣最低位對齊)
//然後轉爲字符再轉爲字符數組
kradix[i]=new StringBuffer(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++){
//不進位加法
//k個相同的k進制數做不進位加法等於0
for(int j=0;j<maxlen;j++){
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)*(Math.pow(k, i));
}
System.out.println(res);
/******************************************************/
//方法二
two(k, arr);
}
//【僅僅指k爲偶數的時候】
/*
* 算法思想:
* 利用位運算,一個數異或一個數2次還是那個數
*/
public static void two(int k,int[]arr ) {
int N=0;
for(int i=0;i<arr.length;i++){
N=N^arr[i];
}
System.out.println(N);
}
}
題目2
隨機一個數,其二進制中有多少個一
public class 二進制中有幾個1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N =sc.nextInt();
//方法一
/*算法思想
*可以理解爲每一位數都在序的&1
* 數字在不斷的右移
*/
int count=0;
for(int i=0;i<32;i++){
if(((N>>>i)&1)==1)
count++;
}
System.out.println(count);
//方法二
/*算法思想
* 可以理解爲每一位數都在序的&1
* 1在不斷的左移
*
*/
count=0;
for(int i=0;i<32;i++){
if((N&(1<<i))==(1<<i))
count++;
}
System.out.println(count);
//方法三
/*算法思想:
* 二進制數減去1再與其本身相與,最低位的1就會消失
* 1010
* &1001
* -----
* 1000
*/
count=0;
while(N!=0){
N=(N-1)&N;
count++;
}
System.out.println(count);
}
}