1、应用技巧1:与&【消除x(二进制)最后一位1】
def checkPowerof2(x): return x>0 and x&(x-1)==0
应用三:判断n是否为4的幂:
def isFour(n): m=1 while m
2、应用技巧2:子集
// Non Recursionclass Solution { /** * @param S: A set of numbers. * @return: A list of lists. All valid subsets. */ public List> subsets(int[] nums) { List > result = new ArrayList
>(); int n = nums.length; Arrays.sort(nums); // 1 << n is 2^n // each subset equals to an binary integer between 0 .. 2^n - 1 // 0 -> 000 -> [] // 1 -> 001 -> [1] // 2 -> 010 -> [2] // .. // 7 -> 111 -> [1,2,3] for (int i = 0; i < (1 << n); i++) { List subset = new ArrayList (); for (int j = 0; j < n; j++) { // check whether the jth digit in i's binary representation is 1 if ((i & (1 << j)) != 0) { subset.add(nums[j]); } } result.add(subset); } return result; }}
3、应用技巧3:异或
java代码:
public class Solution { public int singleNumber(int[] nums) { int ones = 0, twos = 0; for(int i = 0; i < nums.length; i++){ ones = (ones ^ nums[i]) & ~twos; twos = (twos ^ nums[i]) & ~ones; } return ones; }}
public class Solution { public int[] singleNumber(int[] nums) { //用于记录,区分“两个”数组 int diff = 0; for(int i = 0; i < nums.length; i ++) { diff ^= nums[i]; } //取最后一位1 //先介绍一下原码,反码和补码 //原码,就是其二进制表示(注意,有一位符号位) //反码,正数的反码就是原码,负数的反码是符号位不变,其余位取反 //补码,正数的补码就是原码,负数的补码是反码+1 //在机器中都是采用补码形式存 //diff & (-diff)就是取diff的最后一位1的位置 diff &= -diff; int[] rets = {0, 0}; for(int i = 0; i < nums.length; i ++) { //分属两个“不同”的数组 if ((nums[i] & diff) == 0) { rets[0] ^= nums[i]; } else { rets[1] ^= nums[i]; } } return rets; }}