出現k次與出現1次,二進制中有幾個1

題目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);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章