137.只出现一次的数字II(位运算)
class Solution {
public int singleNumber(int[] nums) {
// int len = nums.length;
// if(len < 2) return nums[0];
// Arrays.sort(nums);
// if(nums[1] != nums[0]) return nums[0];
// for(int i = 1; i < len - 1; i++) {
// if(nums[i] != nums[i - 1] && nums[i] != nums[i + 1]) return nums[i];
// }
// return nums[len - 1];
int[] counts = new int[32];
for(int num : nums) {
for(int j = 0; j < 32; j++) {
counts[j] += num & 1; // 更新第 j 位,counts[0]是最低位,count[31]是最高位
num >>>= 1; // 第 j 位 --> 第 j + 1 位
}
}
int res = 0;
for(int i = 0; i < 32; i++) {
res <<= 1; //低位 --> 高位,故先给最高位的数,后一步步往左移
res = res | counts[31 - i] % 3;
}
return res;
}
}
138.复制带随机指针的链表(指针法 + HashMap)
class Solution {
public Node copyRandomList(Node head) {
if(head == null) return null;
Node node = head;
while(node != null) {
Node temp = new Node(node.val);
temp.next = node.next;
node.next = temp;
node = temp.next;
}
node = head;
while(node != null) {
if(node.random != null) {
node.next.random = node.random.next;
}
node = node.next.next;
}
node = head;
Node res = new Node(-1);
Node temp = res;
while(node != null) {
temp.next = node.next;
node.next = node.next.next;
node = node.next;
temp = temp.next;
}
return res.next;
}
}