题目:
解析:
最优解法位图思想及其操作方法:
代码:
方法二:位图思想
public boolean isUnique(String astr) { //解法二:利用位图思想 int len = astr.length(); //利用鸽巢原理优化 if(len > 26) return false; int bitMap = 0; for(int i = 0; i < astr.length(); i++){ //先拿到字符在int的哪一个位置 int x = astr.charAt(i) - 'a'; //(判断字符是否在位图中)规定该位置int里为1则字符串出现过,0则没有出现过 if(((bitMap >> x) & 1) == 1) return false; else bitMap |= (1 << x); //该位置在位图中就置为1 } return true; }
方法一:普通哈希表
public boolean isUnique(String astr) { //方法一:哈希表 Map<Character,Integer> hash = new HashMap<>(); for(int i = 0; i < astr.length(); i++){ char ch = astr.charAt(i); if(hash.containsKey(ch)) return false; else hash.put(ch,hash.getOrDefault(ch,0)+1); } return true; }
题目:
代码:方法一位运算:
public int missingNumber(int[] nums) { //方法一:把数组0到n下标和原数组的元素异或到一起 int ret = 0; for(int x : nums) ret ^= x; for(int i = 0; i <= nums.length; i++) ret ^= i; return ret; }
方法二:哈希表,
把原数组在哈希表一个标记,下次遍历哈希表如果没有标记就返回
public int missingNumber(int[] nums) { int n = nums.length; boolean[] hash = new boolean[n+1]; for(int i = 0; i < n; i++) hash[nums[i]] = true; int i; for(i = 0; i <= n; i++) if(!hash[i]) break; return i; }
方法三:高斯求和公式(等差数列求和公式)
public int missingNumber(int[] nums) { int n = nums.length; int total = (0 + n) * (n+1) / 2; int sum = 0; for(int x : nums) sum += x; return total - sum; }
题目:
解析:
代码:
public int getSum(int a, int b) { int ret = 0; int z = 0; while(b != 0){ int x = a^b;//算出无进位的结果 int carry = (a&b)<<1;//计算进位 //像列竖式加法一样,循环起来,直到,进位为0时加法结束 a = x; b = carry; } return a; }
题目:
![]()
解析:拿到每一位的比特位,求和,再模三就是出现1次的结果
代码:
public int singleNumber(int[] nums) { int ret = 0; for(int i = 0; i < 32; i++){//操控比特位 int sumBit = 0; //统计i位置所有的数,每一位比特位1的个数(不能写在外面) for(int x : nums) if(((x>>i) & 1) == 1) sumBit++; sumBit %= 3; if(sumBit == 1)//等于0,不用特意初始化 ret |= (1<<i); } return ret; } }
题目:
解析:
![]()
代码:
public int[] missingTwo(int[] nums) { //1.把所有的数异或在一起,包括1到N下标 int tmp = 0; for(int x : nums) tmp ^= x; for(int i = 1; i <= nums.length+2; i++) tmp ^= i; //找出a和b比特位不同的哪一位,方便后续分开异或找出a,b int diff = 0; while(true){ if(((tmp>>diff) & 1) == 1) break; else diff++; } int[] ret = new int[2]; //将所有的数按照diff不同分两类异或 for(int x : nums){ if(((x>>diff) & 1) == 1) ret[0] ^= x; else ret[1] ^= x; } for(int i = 1; i <= nums.length+2; i++) if(((i>>diff) & 1) == 1) ret[0] ^= i; else ret[1] ^= i; return ret; }