第一周 2021年12月1日2021年12月8日 数组和字符串

力扣算法小结

第一题:移动零

leetcode地址:https://leetcode-cn.com/problems/move-zeroes/

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

相关标签 数组+双指针

方法:

方法一:双指针,将非零的元素移动到数组的前面,后面根据数组的长度赋值为0即可

方法二:双指针,将零和非零的元素交换,非零的逐渐靠前,零逐渐靠后

思路:

方法一:

设置两个指针一个为快指针fast,一个为慢指针slow,通过一个while循环遍历数组,然后if语句判断,如果数组元素nums[fast]等于0就fast指针+1去判断下一个元素,如果数组元素nums[fast]不等于0则将该元素赋值给下标变量为为slow的数组中去即nums[slow++],当把数组中的非零元素都放到nums[slow++]之后,最后再把数组剩余的下标元素直接赋值为0即可。

方法二:

设置两个指针一个为快指针fast,一个为慢指针slow,通过一个for循环遍历数组,然后if语句判断,如果数组元素nums[fast]不等于0,则将nums[fast]与nums[slow]进行交换,然后slow++,意思就是说当nums[fast]不等于0,就将slow+1然后在交换两个数组的值,这样就可以将非零元素逐渐前移,零元素逐渐后移。

方法一代码:

class Solution {
    public void moveZeroes(int[] nums) {
        //方法一
        int slow=0; //快指针
        int fast=0; //慢指针
        while(fast<nums.length){
            if(nums[fast]==0){ //数组元素等于0就下标+1
                fast++;
            }else { //数组元素不等于=就将元素复制到另一个数组
                nums[slow++]=nums[fast++];
            }
        }
        for(;slow<nums.length;slow++){ //将数组中剩余的位置赋值为0
            nums[slow]=0;
        }
    }
}

方法二代码:

class Solution {
    public void moveZeroes(int[] nums) {
        //方法二
        int slow=0; //慢指针
        int temp=0;
        for(int fast=0;fast<nums.length;fast++){ //快指针
            if(nums[fast]!=0){ //数组元素不为0,交换元素,慢指针下标+1
                temp=nums[slow];
                nums[slow]=nums[fast];
                nums[fast]=temp;
                slow++;
            }
        }
    }
}

第二题:删除排序数组中的重复项

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);

// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

示例:

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列

相关标签 数组 双指针

方法:

方法一:双指针,如果快指针数组中的值不存在于慢指针数组中,就将该值加入到慢指针数组中去

思路:

首先遍历数组,然后if语句判断快指针对应的值是否与慢指针对应的值相等,如果相等则fast+1,如果不等就将nums[fast]的值加入到nums[++slow]里面去,注意:这里是++slow而不是slow++,因为初始化的slow=0,所以后面需要先让慢指针slow+1才能放值进去,最后返回slow+1即可,因为+1是slow最开始等于0,这里最后需要返回的是数组的实际长度.

代码:

方法一:

class Solution {
    public int removeDuplicates(int[] nums) {
        int slow=0; //慢指针
        for(int fast=1;fast<nums.length;fast++){ //快指针
            if(nums[fast]!=nums[slow]){ //如果快指针数组中的值不存在于慢指针数组中,则将该值加入到慢指针数组中去
                nums[++slow]=nums[fast];
            }
        }
        return slow+1; //返回慢指针数组中的实际长度
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值