1-leetcode136. 只出现一次的数字
注意:√
- 确实是技巧题,看一眼知道技巧就很难忘记的那种
- 异或运算可以删去相同的数字,然后剩下只出现一次的结果
public int singleNumber(int[] nums) {
int n = nums.length;
if (n == 1) {
return nums[0];
}
int res = 0;
for (int i = 0; i < n; i++) {
res = res ^ nums[i];
}
return res;
}
2-leetcode169. 多数元素
注意:√
- 传统办法肯定是用个字典啥的记录次数
- 排序的思想:如果这个众数是中间大小的数字,这个逻辑肯定没问题。极端一点,如果是最大或者最小的数,因为数字个数过半了,所以排序以后,正中间的元素也是这个元素,所以可以直接得到结果
- 第二种方式是眼中的数组只有target和非target,二者直接相消,最后剩下来的肯定是target
public int majorityElement(int[] nums) {
Arrays.sort(nums);
return nums[nums.length / 2];
}
public int majorityElement1(int[] nums) {
int target = 0;
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (count == 0){
target = nums[i];
count = 1;
}else if (nums[i] == target){
count++;
}else {
count--;
}
}
return target;
}
3-leetcode75. 颜色分类
注意:×
- 这道题的trick我感觉在与
指针回退
for循环里面对于2
类型进行了while
循环操作,刚开始不理解,看了一些题解以后发现,如果我换回来的数字也是2,没有写while
的情况下,当前这个数字就被略过了,也就是题解中的需要指针回退
的问题
public void sortColors(int[] nums) {
int p0 = 0;
int p1 = nums.length-1;
for (int i = 0; i < nums.length; i++) {
while (i<=p1 && nums[i]==2){
int temp = nums[p1];
nums[p1] = nums[i];
nums[i] = temp;
p1--;
}
if (nums[i] == 0){
int temp = nums[p0];
nums[p0] = nums[i];
nums[i] = temp;
p0++;
}
}
}
4-leetcode31. 下一个排列
注意:×
- 错了很多遍,首先是思路的问题,如果看到这个题第一反应没思路,就去看题解
- 注意n的循环部分
i>0
如果按照传统的nums.forr i>=0
在下面执行nums[i-1]
的时候就会报错 - 注意如果最外面的
for--n
都跑完了,说明这个数组就是最大的数组的,就得返回最小的那个排列,放在最下面要执行一下Arrays.sort
- 最后要注意
Arrays.sort(nums, i, n)
经典左闭右开
public void nextPermutation(int[] nums) {
int n = nums.length;
for (int i = n - 1; i > 0; i--) {
if (nums[i] > nums[i - 1]) {
Arrays.sort(nums, i, n);
for (int j = i; j < n; j++) {
if (nums[j]>nums[i-1]){
int temp = nums[i-1];
nums[i-1] = nums[j];
nums[j] = temp;
return;
}
}
}
}
Arrays.sort(nums);
return;
}
5-leetcode287. 寻找重复数
注意:√
- 题解的思路很好,首先明确前提,整数的数组 nums 中的数字范围是 [1,n]
- 然后就是快慢指针判断是是否有环
public int findDuplicate(int[] nums) {
int slow = 0;
int fast = 0;
slow = nums[slow];
fast = nums[nums[fast]];
while (slow != fast){
slow = nums[slow];
fast = nums[nums[fast]];
}
int before = 0;
int after = slow;
while (before != after){
before = nums[before];
after = nums[after];
}
return before;
}