class Solution { public int hammingDistance(int x, int y) { // 暴力枚举: int count = 0; for (int i = 0; i < 32; i++) { // 计算出对应位置的值 int temp1 = ((x>>i) & 1); int temp2 = ((y>>i) & 1); // 看看两者的值是否相等 if ((temp1 ^ temp2) == 1) { count++; } } return count; }}
2、位图思想版(细化版的哈希) :
class Solution { public boolean isUnique(String astr) { int ret = 0; int n = astr.length(); if (n > 26) { // 多于26个,那么肯定是有重复的了 return false; } for (int i = 0; i < n; i++) { int x = astr.charAt(i)-'a'; if ((ret & (1<<x)) != 0) { // 重复了 return false; } else { ret |= (1<<x); // 加入位图 } } return true; }}
class Solution { public int singleNumber(int[] nums) { Map<Integer, Integer> hash = new HashMap<>(); for (int i = 0; i < nums.length; i++) { hash.put(nums[i], hash.getOrDefault(nums[i], 0)+1); } for (int i = 0; i < nums.length; i++) { if (hash.get(nums[i]) == 1) { return nums[i]; } } return -1; }}
2、
class Solution { public int hammingDistance(int x, int y) { // 异或+统计1的个数 int count = 0; int n = x ^ y; while (n != 0) { count++; n = n & (n-1); // 消除1 } return count; }}
class Solution { public int missingNumber(int[] nums) { int n = nums.length; int sum = (int)((0+n) / 2.0 * (n+1)); // (0+n) * (n+1) / 2 ,这个也行 for (int i = 0; i < n; i++) { sum -= nums[i]; } return sum; }}
class Solution { public int[] singleNumber(int[] nums) { // 暴力枚举:哈希表统计 Map<Integer, Integer> hash = new HashMap<>(); for (int i = 0; i < nums.length; i++) { hash.put(nums[i], hash.getOrDefault(nums[i], 0)+1); } int[] ret = new int[2]; int j = 0; for (int i = 0; i < nums.length; i++) { if (hash.get(nums[i]) == 1) { ret[j++] = nums[i]; } } return ret; }}
class Solution { public int singleNumber(int[] nums) { int ret = 0; for (int i = 0; i < 32; i++) { // 计算某一个比特位上的和 int sum = 0; for (int j = 0; j < nums.length; j++) { sum += ((nums[j] >> i) & 1); } // 求出只出现一次所对应的比特位 sum %= 3; // 设置对应位置的比特位 ret |= (sum << i); } return ret; }}
拓展:当数组中一个数字出现一次,另外的数字出现 n 次时,也可以使用上述的思路。异或运算:
class Solution { public int missingNumber(int[] nums) { int sum = 0; for (int i = 0; i < nums.length; i++) { sum ^= nums[i]; sum ^= i; } return sum ^ nums.length; }}
class Solution { public int hammingWeight(int n) { int count = 0; for (int i = 0; i < 32; i++) { if (((1<<i) & n) != 0) { // 这个位是1 count++; } } return count; }}
2、哈希思想版:
class Solution { public boolean isUnique(String astr) { // 哈希表记录遍历的字符 int[] hash = new int[26]; for (int i = 0; i < astr.length(); i++) { char ch = astr.charAt(i); if (hash[ch-'a'] != 0) { // 说明已经出现了重复的字符 return false; } else { hash[ch-'a']++; } } return true; }}
2、 3n个0 + 0 2、
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
代码实现:
1、计算进位的结果 b = (a & b) << 1; a = temp; } while (b != 0); return a; }}
class Solution { public static int[] missingTwo(int[] nums) { // 先找到分组的依据 int n = nums.length; int sum = 0; for (int i = 1; i < n+3; i++) { sum ^= i; } for (int i = 0; i < n; i++) { sum ^= nums[i]; } // 找到最右边的1,作为分组的依据 int mask = sum & (-sum); // 将 mask 作为分组的依据 int[] ret = new int[2]; for (int i = 1; i < n+3; i++) { if ((mask & i) != 0) { // 这里不一定是1 ret[0] ^= i; } else { ret[1] ^= i; } } for (int i = 0; i < n; i++) { if ((nums[i] & mask) != 0) { // 这里不一定是1 ret[0] ^= nums[i]; } else { ret[1] ^= nums[i]; } } return ret; }}
class Solution { public int missingNumber(int[] nums) { // 找出最大值 int n = nums.length; Arrays.sort(nums); // 排序 // 缺失的是最大值 if (n != nums[n-1]) { return n; } for (int i = 0; i < n; i++) { if (i != nums[i]) { return i; } } return -1; }}
2、因为 /2得到的是一个整数,可能出现分数的情况被忽略了。哈希暴力:
class Solution { public int[] missingTwo(int[] nums) { // 哈希表遍历统计 int n = nums.length; int[] hash = new int[n+3]; // 0+缺失的两个空间 int[] ret = new int[2]; for (int x : nums) { hash[x]++; } int j = 0; for (int i = 1; i < n+3; i++) { if (hash[i] == 0) { ret[j++] = i; } } return ret; }}
2、也可以采用 哈希的思想,遍历记录出现的次数,然后再遍历哈希表,找到没出现的数字。这里其实就是利用 ^ 操作符 对于奇数次 ^ 一个数字之后,得到的还是这个数字本身,偶数次 ^ 一个数字之后,得到的就是0 来编写代码。计算无进位相加的结果 int temp = a ^ b; // 2、
class Solution { public int[] singleNumber(int[] nums) { // 先分组,再分别统计 int[] ret = new int[2]; int sum = 0; for (int i = 0; i < nums.length; i++) { sum ^= nums[i]; // 这个是两个数字的异或结果 } // 找到两个数字有区别的地方进行分组 int mask = sum & (-sum); // 找到最右边第一个出现的1 for (int i = 0; i < nums.length; i++) { if ((nums[i] & mask) == 0) { ret[0] ^= nums[i]; } else { ret[1] ^= nums[i]; } } return ret; }}
class Solution { public int getSum(int a, int b) { do { // 1、哈希表:
class Solution { public int missingNumber(int[] nums) { int n = nums.length; int[] hash = new int[n+1]; for (int i = 0; i < n; i++) { hash[nums[i]]++; } for (int i = 0; i < n+1; i++) { if (hash[i] == 0) { // 找到了 return i; } } return -1; }}