前言
之前刷算法题,不懂的题目搞懂后,发现过一段实践再次刷还是做不出来,究其原因是因为没有深刻理解,所以萌生了用图记录下解题思路的想法,以帮助自己快速的定位问题和获取解题思路。在这里,会定时更新和记录一些算法的题解。
位运算
剑指 Offer 15. 二进制中1的个数
public class Solution {
public int hammingWeight(int n) {
int cnt = 0;
while(n != 0){
cnt++;
n &= (n-1);
}
return cnt;
}
}
剑指 Offer 56 - I. 数组中数字出现的次数
描述:前提:数组
nums
里除两个数字之外,其他数字都出现了两次;限制:要求时间复杂度是O(n),空间复杂度是O(1)。
- 采用位运算
class Solution {
public int[] singleNumbers(int[] nums) {
int z = 0, x = 0,y = 0,m = 1;
for(int num : nums){
z ^= num;
}
while((z & m) == 0){
m <<= 1;
}
for(int num : nums){
if((num & m) == 0){
x ^= num;
}else{
y ^= num;
}
}
return new int[]{x,y};
}
}
- 因为时间复杂度和空间复杂度的限制,所以不能用哈希表进行解决,但还是写下解决思路:
class Solution {
public int[] singleNumbers(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
int cnt = map.getOrDefault(num, 0);
map.put(num, ++cnt);
}
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (map.get(nums[i]).equals(1)) {
list.add(nums[i]);
}
}
return list.stream().mapToInt(Integer::valueOf).toArray();
}
}