Leetcode热题——移动零

一,题目

https://leetcode.cn/problems/move-zeroes/submissions/594915685

其实就是考察随机快排那部分知识点。

二,答案

1,逐个交换(类似冒泡法)

准备两个函数,一个负责交换向量元素位置,一个负责将非零元素向前移动(最初我是想将0往后移,发现如果在移动过程中遇到0有点麻烦,所以转换思路改为移动非零元素)

代码

cpp 复制代码
class Solution {
public:
    void swap(int& a,int& b)
    {
        int x = a;
        a = b;
        b = x;
    }

    void moveHead(vector<int>& nums,int i)
    {
        while(i >= 1)
        {
            if(nums[i - 1])break;
            else swap(nums[i - 1],nums[i--]);
        }
    }
    void moveZeroes(vector<int>& nums)
    {
        for(int i = 0;i < nums.size();i++)
        {
            if(nums[i]) moveHead(nums,i);
        }
    }
};

效果

2,双指针

我的思路是直接赋值将非零数拷贝到向量前面,记录0的个数,最后将最后几个全部变为0就行了。

代码

cpp 复制代码
class Solution {
public:
    void moveZeroes(vector<int>& nums)
    {
        int count = 0;
        int first = 0;
        int index = 0;
        int len = nums.size();
        while(index < len)
        {
            if(nums[index]) nums[first++] = nums[index];
            else count++;
            index++;
        }

        for(int i = 1;i <= count;i++)
        {
            nums[len - count - 1 + i] = 0;
        }
    }
};

效果

3,标准答案

cpp 复制代码
class Solution 
{
public:
    void moveZeroes(vector<int>& nums) 
    {
        // 方法二 : 前后指针的快排思想
        int prv = -1, cur = 0;
        while (cur < nums.size())
        {
            if(nums[cur] != 0)
            {
                swap(nums[++prv], nums[cur]);
            }
            cur++;
        }
    }
};
相关推荐
Watink Cpper7 分钟前
[灵感源于算法] 算法问题的优雅解法
linux·开发语言·数据结构·c++·算法·leetcode
随意02313 分钟前
STL 3算法
开发语言·c++·算法
_风满楼39 分钟前
如何优雅展示日历中的重叠日程?三步搞定复杂布局
前端·javascript·算法
এ᭄画画的北北2 小时前
力扣-35.搜索插入位置
数据结构·算法·leetcode
cylat2 小时前
Day23 pipeline管道
人工智能·python·算法·机器学习
lucky_jiexia2 小时前
leetcode刷题经验
算法·leetcode·哈希算法
蓝澈11212 小时前
数据结构之常用排序算法(冒泡、选择等)
数据结构·算法·排序算法
有梦想的骇客8 小时前
书籍将正方形矩阵顺时针转动90°(8)0605
线性代数·算法·矩阵
有梦想的骇客8 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
Chenyu_3109 小时前
12.找到字符串中所有字母异位词
c语言·数据结构·算法·哈希算法