Leetcode刷题之位运算(Java)

Posted 哈喽喔德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题之位运算(Java)相关的知识,希望对你有一定的参考价值。

位运算是算法题中比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。常用的位运算符号包括:

^  按位异或
&  按位与
|  按位或
~  取反
<< 左移位
>> 右移位

力扣例题

461. 汉明距离

分析:

异或运算保留不同的二进制的位,&1取出最后一位,>>向右移位。

题解:

class Solution 
    public int hammingDistance(int x, int y) 
    	//将两数进行按位异或运算,将二进制位不同的位置为1
    	int n = x ^ y;
    	int count = 0;
    	System.out.println("source n: "+Integer.toBinaryString(n)+"\\n");
    	
    	while(n!=0) 
    		//每次取得最后一位计入结果
    		count += n&1;
    		System.out.println("n&1: " + Integer.toBinaryString(n&1));
    		//记录后向右移位
    		n >>= 1;
    		System.out.println("n >>= 1: "+Integer.toBinaryString(n)+"\\n");
    	
    	
    	return count;
    

190. 颠倒二进制位

分析:

将n视作一个长为32的二进制串,从低位往高位枚举n的每一位,将其倒序添加到反转结果reverse中。

题解:

class Solution 
	public int reverseBits(int n) 
        int reverse = 0;
        //整形有32位,对每一位逐个处理
        for(int i=0;i<32;++i) 
        	//将reverse左移一位,留出最低位
        	reverse <<= 1;
        	//将reverse最低位赋值为n的最后一位
        	reverse += n&1;
        	//将n右移一位
        	n >>= 1;
        
        return reverse;
    

136. 只出现一次的数字

分析:

x ^ x = 0;x ^ 0 = x。将数组内的所有数字异或,出现两次的数字异或结果为0,0与出现一次的数字异或可以得到数字本身。

同种位运算满足交换律和结合律。

题解:

class Solution 
    public int singleNumber(int[] nums) 
    	int ans = 0;
    	for(int i=0;i<nums.length;++i) 
    		ans ^= nums[i];
    	
    	return ans;
    

342. 4的幂

分析:

可以先保证是2的幂,再次基础上利用4的幂对3取模余数为1的性质得到答案。

对于2的幂有:n & (n-1) = 0

题解:

class Solution 
    public boolean isPowerOfFour(int n) 
        return n > 0 && (n & (n - 1)) == 0 && n % 3 == 1;
    

318. 最大单词的长度乘积

分析:

因为这里并不在意字符串中字母的顺序,因此可以为每个字符串创建一个长为26的二进制串,包含了的字母位置为1。这样按位与运算后,有相同字母的字符串不为0。

题解:

class Solution 
	public int maxProduct(String[] words) 
    	int n = words.length;
    	int[] binary = new int[n];
    	
    	for(int i=0;i<n;++i) 
    		int len = words[i].length();
    		for(int j=0;j<len;++j) 
					//这个得到对应位为1的二进制串的方法需要想通
    			binary[i] |= 1 << (words[i].charAt(j)-'a');
    		
    	
    	
    	int max = 0;
    	for(int i=0;i<n;++i) 
    		for(int j=i+1;j<n;++j) 
    			if((binary[i]&binary[j]) == 0) 
    				max = Math.max(max, words[i].length()*words[j].length());
    			
    		
    	
    	
    	return max;
    

338. 比特位计数

分析:

可以结合位运算与动态规划,设dp[i]表示i的二进制串中1的个数。如果i的最后一位是1的话,dp[i] = dp[i-1]+1;如果i的最后一位是0的话,dp[i] = dp[i>>1],相当于忽略最后一位。

题解:

class Solution 
    public int[] countBits(int n) 
        int[] dp = new int[n+1];
        
        for(int i=1;i<=n;++i) 
        	if((i&1)==1) 
        		dp[i] = dp[i-1]+1;
        	
        	else 
        		dp[i] = dp[i>>1];
        	
        
        
        return dp;
    

以上是关于Leetcode刷题之位运算(Java)的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 位运算 - 最大单词长度乘积,leetcode 318

LeetCode刷题之搜索(Java)

LeetCode刷题之搜索(Java)

leetcode刷题之二分查找(Java)

Leetcode刷题之二分查找(Java)

Leetcode刷题之动态规划(Java)