题目: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:用两个指针,分别指向最开始和最结尾两个下标。每次都比较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;
}
}
}
}