刷题练习笔记

目录

1、消失的数字

2、旋转数组

3、原地移除元素

4、删除排序数组中的重复项


1、消失的数字

oj:面试题 17.04. 消失的数字 - 力扣(LeetCode)

思路(参考评论区):

利用异或的特性,ret = ret ^ x ^ x。级对同一个值异或两次,结果等于它本身

所以对 ret 从 0 - nums.length 进行异或,同时对 nums 数组中的值进行异或,出现重复的会消失,所以最后 ret 的值是只出现一次的数字,也就是nums数组中缺失的那个数字。

java 复制代码
class Solution {
    public int missingNumber(int[] nums) {
        int ret = 0;
        for(int i = 0; i < nums.length; i++) {
            ret ^= i;
            ret ^= nums[i];
        }
        ret ^= nums.length;
        return ret;
    }
}

2、旋转数组

oj:189. 轮转数组 - 力扣(LeetCode)

思路:

  1. 使用额外的数组将每个元素放至旋转后的位置

  2. 遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)%n 的位置

  3. 再把新数组写回原数组

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int len = nums.length;
        int[] newArr = new int[len];
        for(int i = 0; i < len; i++){
            newArr[(i+k)%len] = nums[i];
        }
        for(int j = 0; j < len; j++){
            nums[j] = newArr[j];
        }
    }
}

3、原地移除元素

oj:226. 翻转二叉树 - 力扣(LeetCode)

思路:

  1. 遍历数组 nums,设置一个下标 ans
  2. 在遍历过程中如果出现数字不是需要被移除的值,则把这个数字覆盖到ans所在的下标位置,ans 自增 1
  3. 如果相同的时候,则跳过该数字不进行覆盖,最后 ans 即为新的数组长度
java 复制代码
// 时间复杂度:O(n),空间复杂度:O(1)
class Solution {
    public int removeElement(int[] nums, int val) {
        int ans = 0;
        for(int i = 0; i<nums.length; i++) {
            if(nums[i] != val) {
                nums[ans] = nums[i];
                ans++;
            }
        }
        return ans;
    }
}

4、删除排序数组中的重复项

oj:26. 删除有序数组中的重复项 - 力扣(LeetCode)

思路:

  1. 与上题类似,使用两个指针,fast用于遍历数组,slow位置用于存放不重复项

  2. 在遍历过程中如果出现数字不是重复值,则把这个数字覆盖到slow所在的下标位置

  3. slow+1 即为数组中唯一元素的数量

java 复制代码
class Solution {
    public int removeDuplicates(int[] nums) {
        int fast = 1;
        int slow = 0;
        for(; fast<nums.length; fast++) {
            if(nums[fast] != nums[slow]) {
                nums[slow+1] = nums[fast];
                slow++;
            }
        }
        return slow+1;
    }
}
相关推荐
罗西的思考26 分钟前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
aloha_78930 分钟前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
淡海水31 分钟前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
知守观1 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅1 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff2 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
下一站春风里2 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot3 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李3 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法