zoukankan      html  css  js  c++  java
  • 位操作

    统计1的个数

    题目来源

    LeetCode 191. Number of 1 Bits

    解题思路

    • 方法一
      依次判断最后一位是否为1,统计个数

    • 方法二
      通过n&(n-1)快速跳过不为1的末位

    精简解题

    func hammingWeight(num uint32) int {
    	ret := 0
    	for num > 0 {
    		ret++
    		num = num & (num-1)
    	}
    	return ret
    }
    

    2的N次方判断

    题目来源

    LeetCode 231. Power of Two

    解题思路

    • 方法一
      每次模2,判断是否不等于0

    • 方法二
      使用开方,判断结果是否为整数

    • 方法三
      统计1的个数,有且只有一个1

    精简解法

    func isPowerOfTwo(n int) bool {
        if n !=0 && n&(n-1) == 0 {
            return true
        }
        return false
    }
    

    2的N次方判断

    题目来源

    LeetCode 338. Counting Bits

    解题思路

    • 方法一
      深入理解n&(n-1)的内核,即表示n的最后一位1置0的数

    精简解法

    func countBits(num int) []int {
        ret := make([]int,num+1)
        for i:=1;i<=num;i++ {
            ret[i] = ret[i&(i-1)] + 1
        }
        return ret
    }
    

    N皇后问题总数

    题目来源

    LeetCode 51. N-Queens II

    解题思路

    • 方法一
      回溯法
    • 方法二
      使用位代表具体置1的位置,高级的位技巧,必须学习

    精简解法

    func totalNQueens(n int) int {
    	count := 0
    	p := &count
    	if n < 1 {
    		return 0
    	}
    	dfs52(n, 0, 0, 0, 0, p)
    	return count
    }
    
    func dfs52(n int, row int, cols int, slash int, backslash int, count *int) {
    	//终止条件
    	if row >= n {
    		*count++
    		return
    	}
    	//获取本行剩余不为0的位置
    	bits := ^(cols | slash | backslash) & ((1 << uint(n)) - 1)
    	for bits > 0 {
    		//拿最后一个为1的位置
    		p := bits & -bits
    		dfs52(n, row+1, cols|p, (slash|p)<<1, (backslash|p)>>1, count)
    		//提测最后一个为1的位置
    		bits = bits & (bits - 1)
    	}
    }
    
  • 相关阅读:
    traceroute工具
    tcpdump抓包
    Linux 信号表 signals
    Bloom Filter (海量数据处理)
    socks v5 协议解析
    Vim插件推荐
    建堆复杂度O(n)证明
    使用Vundle管理Vim插件
    VB调用C# dll
    域PC脱域
  • 原文地址:https://www.cnblogs.com/weiweng/p/12486232.html
Copyright © 2011-2022 走看看