01数组:27、移除元素

重点是:数组是连续的,快指针始终在前面,遍历过的元素就不要了,刚好留着前面空间让慢指针存储元素

  • 暴力解法(两个for循环,第一层遍历,找到元素后,第二层向前移动后面元素)
  • 双指针:
    1. 快指针遍历元素,慢指针存储新元素;
    2. 没找到就一起向前移动指针,找到了就跳过,只有快指针移动
    3. 慢指针每一次赋值都是指向下一个要检查的元素

方法一:暴力破解法

        // 暴力解法(两个for循环,第一层遍历,找到元素后,第二层向前移动后面元素)
        public int removeElement(int[] nums, int val) {
            int size = nums.length;
            for (int i = 0; i < size; i++) {
                if (nums[i] == val) {
                    for (int j = i; j < nums.length-1; j++) {
                        nums[j] = nums[j + 1];
                    }
                    i--; //因为这个元素被第二层刷新了,重新赋值,需要重新判断
                    size--;//移动后,少了一位
                }
            }
            return size;
        }

方法二:双指针法

        public int removeElement(int[] nums, int val) {
            int slow = 0;       //慢指针
            for (int fast = 0; fast < nums.length; fast++) {  //快指针遍历
                if (nums[fast] != val) {  //只有找不到元素,才给慢指针赋值,是需要的数据,否则只有快指针移动
                    nums[slow] = nums[fast];
                    slow++; //指向下一个需要检查的元素
                }
            }
            return slow;  //从0开始,数字是下个检查元素,和长度相等
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值