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;
	}
}

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