1.题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明: 必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
2.想法
(1)用冒泡排序的思想,每遇到一个0就将其往后冒泡,最终得到数组
(2)想法一使用了两个for循环,时间复杂度n的平方很显然不行,就想到了用计数交换法,每遇到一个0就计下sum,非0元素则与第前sum个元素交换,时间复杂度可减到O(n)
3.冒泡型
class Solution {
public void moveZeroes(int[] nums) {
for(int i=0;i<nums.length;i++)
{
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]==0)
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
}
}
4.记录数字型
class Solution {
public void moveZeroes(int[] nums) {
int sum=0;
for(int i=0;i<nums.length;i++)
{
if(nums[i]==0){sum++;}
else
{
int temp=nums[i];
nums[i]=nums[i-sum];
nums[i-sum]=temp;
}
}
}
}
5.官方题解
官方题解给出的是c++常用的双指针,这里就不写了