Leetcode题解之数组(7)移动零

题目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/28/

题目描述:

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

示例:

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

说明:

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

 

思路:

解法1:用两个指针,分别指向最开始和最结尾两个下标。每次都比较nums[start]的值是否为0,是的话就,将后面的值向前移动,次数为count=end-star,然后将0赋给nums[end],将下表向左移动一步;如果不为0,移动start指针向右移动。继续比较。

解法2:通过记录零出现的次数,将数组每个元素向前移动zeros格并且和零互换。下表i 遇到零就跳过移动过程,zeros+1。下个元素开始移动zeros+1格 以此类推,每个非零的都会与第一个为0的元素互换位置。

//解法1.
class Solution {
    public void moveZeroes(int[] nums) {
        int star=0;
        int end=nums.length-1;
        int count=0;
        
        while(star<end){
            if(nums[star]==0){
                count=end-star;
                for(int i=0;i<count;i++){
                    nums[star+i]=nums[star+i+1];
                }
                nums[end]=0;
                end--;
             }else{
                star++;
               
            }
        }
    }
}
//解法2:
class Solution {
    public void moveZeroes(int[] nums) {
        int zeros=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==0){
                zeros++;
            } else if(zeros!=0){
                nums[i-zeros]=nums[i];
                nums[i]=0;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值