LeetCode——1.数组2:(2)移除元素(283.移动零、977.有序数组的平方)

目录

283.移动零

方法一 双指针法

方法二 一遍遍历

方法三 增强for循环

977.有序数组的平方

方法一:冒泡排序法的思想

方法二:从两边开始比较

方法三:从中间开始比较


283.移动零

题目链接

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

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

方法一 双指针法

第一段代码是在循环里就把末尾的0替换掉了。

第二段代码又单独设了个count用来记不等于0的个数,循环结束之后为数组末尾添加0。

class Solution {
    public void moveZeroes(int[] nums) {
        int Slow = 0;
        for(int fast = 0; fast < nums.length; fast++) {
            if(nums[Slow] != 0) {
                Slow++;
            }else if(nums[Slow] == 0 && nums[fast] != 0) {
                nums[Slow++] = nums[fast];
                nums[fast] = 0;
            }
        }
    }
}
class Solution {
    public void moveZeroes(int[] nums) {
        int fast = 0;
        int count = 0;
        for(int slow = 0; fast < nums.length; fast++){
            if(nums[fast] != 0) {
                count++;
                nums[slow++] = nums[fast];
            }
        }
        while(count < nums.length){
            nums[count++] = 0;
        }
    }
}

方法二 一遍遍历

只设一个指针来遍历数组,count来记0的个数,count != 0说明数组里面找到了0,如果之后指向的元素不等于0,就让它往前移coun个单位,让当前指向的元素等于0。

class Solution {
    public void moveZeroes(int[] nums) {
        int count = 0;
        for(int point = 0; point < nums.length; point++) {
            if(nums[point] == 0) {
                count++;
            }
            if(nums[point] != 0 && count != 0){
                nums[point-count] = nums[point];
                nums[point] = 0;
            }
        }
    }
}

方法三 增强for循环

增强for循环:遍历nums数组,把值赋给num,注意num不是数组是值,所以在循环里面可以判断num的值来给nums数组赋值,循环结束之后为nums数组赋0。

class Solution {
    public void moveZeroes(int[] nums) {
        int i = 0;
        for(int num : nums) {
            if(num != 0) {
                nums[i++] = num;
            }
        }
        while(i < nums.length) {
            nums[i++] = 0;
        }
    }
}

977.有序数组的平方

题目链接

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]

方法一:冒泡排序法的思想

class Solution {
    public int[] sortedSquares(int[] nums) {
        int i = 0;
        int temp;
        for(int num : nums) {
            nums[i++] = num * num;
        }
        for(int a = 0; a < nums.length-1; a++) {
            for(int b = 0; b < nums.length-1; b++) {
                if(nums[b+1] < nums[b]) {
                    temp = nums[b];
                    nums[b] = nums[b+1];
                    nums[b+1] = temp;
                }
            }
        }
        return nums;
    }
}

方法二:从两边开始比较

class Solution {
    public int[] sortedSquares(int[] nums) {
        int right = nums.length - 1;
        int left = 0;
        int point = right;
        int[] arr = new int[nums.length];
        while(left <= right) {
            if((nums[right] *nums[right]) > (nums[left] * nums[left])) {
                arr[point--] = nums[right] * nums[right];
                right--;
            }else {
                arr[point--] = nums[left] * nums[left];
                left++;
            }
        }
        return arr;
    }
}

方法三:从中间开始比较

找到第一个正数,把nums数组里的元素平方存到新的数组arr里,从第一个正数和最后一个负数的位置开始比较,最后判断剩下元素的情况(刚开始还一直以为只能返回数组nums,之后一看其他题解,都返回的新数组,5555~所以又重新写的第二种方法)

class Solution {
    public int[] sortedSquares(int[] nums) {
        int i = 0;
        int[] arr = new int[nums.length];
        // 找到第一个正数
        for(int num : nums) {
            if(num > 0)
                break; 
            i++;
        }
        int right = i;
        int left = i - 1;
        i = 0;
        // 把nums数组元素平方放到arr数组里
        for(int num : nums) {
            arr[i++] = num * num;
        }
        i = 0;
        // 开始比较了
        while(left >= 0 && right < nums.length) {
            if(arr[right] < arr[left]) {
                nums[i++] = arr[right++];
            }else {
                nums[i++] = arr[left--];
            }
        }
        // 判断left和right有没有到头
        if(left < 0) {
            while(right < nums.length) {
                nums[i++] = arr[right++];
            }
        }
        if(right >= nums.length) {
            while(left >= 0) {
                nums[i++] = arr[left--];
            }
        }
        return nums;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值