Leetcode——位運算191.位1的個數

位運算介紹:
實戰常用的位運算操作:
X&1==1 OR ==0 判斷奇數偶數
X=X&(X-1) 清零最低位的1
X&-X 得到最低位的1
在這裏插入圖片描述

191.位1的個數
【思路】
1.暴力判斷每一位是否,和1做與運算,如果是1,則計數。這樣的做法容易超時,而且有可能此時的數爲負數,右移之後最高位仍要保持最高位是負數。
2。使用x&(x-1)把最低位1變爲0,則有多少個1就進行多少次的操作,直到這個數字爲0。
【實現代碼】

package leetcode_50;

import java.util.Scanner;

public class Leetcode_191 {

	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int result;
		//result=hammingWeight(n);
		result=hammingWeight_2(n);
		System.out.println(result);
	}

	private static int hammingWeight_2(int n) {

		int count=0;
		while(n!=0){
			count++;
			n=n&(n-1);
		}
		return count;
	}

	private static int hammingWeight(int n) {

		int count=0;
		while(n!=0){
			if(n%2==1)
				count++;
			n=n>>1;
		}
		return count;
	}
}

231.2的冪
【思路】
因爲該數要是2的冪的話,則只有一位是1,所以根據位運算的x&(x-1)來判斷最低位的情況,2的冪的話最低位肯定爲0且肯定是大於0的。
【實現代碼】

package leetcode_50;

import java.util.Scanner;

public class Leetcode_231 {

	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		boolean result;
		//result=hammingWeight(n);
		result=isPowerOfTwo(n);
		System.out.println(result);
	}

	private static boolean isPowerOfTwo(int n) {

		if(n!=0&&(n&(n-1))==0)
			return true;
		return false;
	}
	
}

【注意點】
在最後一個測試用例,邊界時,-2^31這個時候算是2的冪吧?爲什麼不能通過,只能改成n>0。

338.比特位計數
【思路】
1.按照記錄位1的個數的解法,做一個循環,每一位取出來判斷然後把結果存進去。
2.在O(n)的限制下完成遍歷,因爲i&(i-1)把最低位的1消爲0,那麼count[i]=count[(i&(i-1))]+1。該遞推公式就能求出最終結果。
【實現代碼】

package leetcode_50;

import java.util.Scanner;

public class Leetcode_338 {

	public static void main(String[] args){
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		int[] result=new int[n+1];
		//result=hammingWeight(n);
		result=countBits(n);
		for(int i=0;i<result.length;i++){
			System.out.println(result[i]);
		}
		
	}

	private static int[] countBits(int n) {

		int[] count=new int[n+1];
		count[0]=0;
		for(int i=1;i<=n;i++){
			count[i]=count[(i&(i-1))]+1;
		}
		return count;
	}
}

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