题目:

解析:
最优解法位图思想及其操作方法:

代码:
方法二:位图思想
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;
}