位运算

位运算

还是那句水题总能水出东西来
都是leetcode的题

1

leetcode 2的幂
题目很简单,判断一个数是否2的幂次方,博主一看秒杀直接一个循环
n%2 == 0
就 n/=2;直到不等于0的时候输出false。。。
但结果题目给予的时间范围极小,,,果断超时,剩下一脸懵的我。。
其实没错,整型2147483647,就算logn,也跑很多次了。。
但是用位运算实际上就一句话
return (n&(n-1)) == 0 (博主比较菜,用的java,c++可以直接返回 (n&(n-1) ))

public boolean isPowerOfTwo(int n) {
       return n > 0 && (n&(n-1)) == 0;
   }

2

leetcode 只出现一次的数字
最普通的做法就是新建个数组计数嘛,两个for循环。
但是用位运算,直接都异或运算一次就得结果了。。因为其他元素均出现了两次,异或的时候出现两次得肯定都被置为0 了

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

3

leetcode 子集
这题求子集,其实用dfs也可以做,但为了突出位运算的特点,还是写出来,尽管相比起来可能比dfs复杂度还高一点点。
用二进制数表示子集;
例如:3 — 011, 表示取0号元素和1号元素
不过拿出这个数后求1具体在哪个位置需要O(n)的复杂度,,其他博客也有二分找位置的,可以提高效率。

public List<List<Integer>> subsets(int[] nums) {
		List<List<Integer>> l = new ArrayList();
		int len = nums.length;
		for(int i = 0; i < 1<<len; i++) {
			List<Integer> ls = new ArrayList();
			for(int j = 0; j < len;j++) {
				if(((1<<j)&i) != 0) {
					ls.add(nums[j]);
				}
			}
			l.add(ls);
		}
		return l;
    }

持续更新位运算

你可能感兴趣的:(水题)