283.Move Zeroes
Description:
Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]
Note:
1.You must do this in-place without making a copy of the array.
2.Minimize the total number of operations.
这道题是要将所有的0移到数组后面。
我的思路是先找出数组中有多少个0,然后两层for循环,外层循环总共执行0的个数次,每一次都将数组中的一个0(从左往后)移到最后。总的思路就是将0往后移。
class Solution {
public void moveZeroes(int[] nums) {
int n = 0;
for(int i=0;i<nums.length;i++){ //记录0的个数,即外层循环执行次数
if(nums[i]==0)
n++;
}
for(int i=0;i<n;i++){
int a = 0; //用a来记录数组中为0的数的索引
while (nums[a]!=0) {
a++;
}
for(int j=a+1;j<nums.length;j++){ //把0移到最后
int temp = nums[a];
nums[a]=nums[j];
nums[j]=temp;
a++;
}
}
}
}
然后在网上看到一位博主的更好方法:参考链接
总体思路是:把非零的数都移到左边。这和我的思路正好相反,这样更是方便了(今后要适当加点营养了…)博主在其文章中说到用的是双指针,前面的指针指向处理过的最后一个非零数字, 后面一个指针向后扫,遇到非零数字则换到前面,前面指针后移1位,最后统一把后面的全部变成0。
这样看来我上面所用的方法也是用了双指针。。
public class Solution {
public void moveZeroes(int[] nums) {
int index = 0; //“前面的指针”一直保持在i的后面或与其同步,index是连续的
for (int i = 0; i < nums.length; ++i) { //i用来寻找非零数的指针
if (nums[i] != 0) {
nums[index++] = nums[i]; //将非零数前移
}
}
for (int i = index; i < nums.length; ++i) { //最后统一为0
nums[i] = 0;
}
}
}
还有一种看起里更加简洁的方法:
class Solution {
public void moveZeroes(int[] nums) {
int j = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] != 0) {
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
j++;
}
}
}
}
其实这个方法的思路与第二种方法一致,都是把非零数往前移,区别在于把非零数往前移的方式不同,前者是直接移,最后统一归零,现在这个是把i指针所指的非零数与前面的指针j所指的数交换,这样0就自然移到了最后边。