力扣191.位1的个数
public class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int ret=0; while(n!=0){ n=(n&n-1); ret++; } return ret; } }
推荐是自己去手动推一下,深刻理解一下,什么叫做最右侧的1。
力扣338.比特位计数
public static int[] countBits(int n) { int[]a=new int[n+1]; a[0]=0; for(int i=1;i<=n;i++){ int ret=0; int m=i; while(m!=0){ m=(m&m-1); ret++; } a[i]=ret; } return a; }
首先是审题,他是要把从0-n位置,所以的都计算一遍有多少个1,那他的本质还是位1的个数,只是说有了多个数字。本质还是位运算,然后我们使用m&m-1把整个二进制数都消为0。
力扣461.汉明距离
这个我在看那个给的二进制,我首先在想他们两个有没有什么联系,所以说他要求的是两个相同的不算,只看不同的位置,这时候想到异或,因为,异或不同是1,然后计算不同位置的数目,所以此时又回变成位1的个数。
力扣面试题01.01判定字符串是否唯一
public static boolean isUnique(String astr) { char[]m=astr.toCharArray(); int[]ret=new int[26]; for(int i=0;i<m.length;i++){ ret[m[i]-'a']++; } for (int i=0;i<26;i++){ if(ret[i]>1){ return false; } } return true; }
模拟一个哈希表,然后把String类型转toCharArray(),转成一个字符数组,用哈希表存储这个数组,然后判断存储的是否有大于1的