力扣学习笔记——283. 移动零
  0okL55w8xmzg 2023年12月07日 17 0


力扣学习笔记——283. 移动零

题目描述

https://leetcode.cn/problems/move-zeroes/description/?envType=study-plan-v2&envId=top-100-liked

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:

输入: nums = [0]
输出: [0]

我的解答

我的思路就是倒序迭代,判断元素是否是0,然后删除,再在最后面新增。

class Solution {
public:
    void moveZeroes(vector<int>& nums) {

        if (0==nums.size())
        {
            std::cout<<"error nums isize is 0!"<<std::endl;
            return;
        }

        for(int i=nums.size()-1;i>-1;--i)
        {
            if (0==nums[i])
            {
                auto it = nums.begin() + i;
                nums.erase(it);
                nums.push_back(0);
            }
        }
    }
};

速度很快的一个解法——使用swap交换

class Solution {
public:
    void moveZeroes(std::vector<int>& nums) {
      int cur = 0, dest = -1;
        while (cur < nums.size())
        {    
            if (nums[cur])
            {
                std::swap(nums[++dest], nums[cur]);
            }
            cur++;
        }
    }
};

我自己根据这个方式写的

void moveZeroes(std::vector<int>& nums) {
        //有任意一个非零值,就往左边第一个非零值后一位移动
        int un_zero_index = 0;
        for (int i = 0; i<nums.size(); i++) {
            if ( nums[i] != 0)
            {
                std::swap(nums[i], nums[un_zero_index]);
                un_zero_index++;
            }
        }
    }

全部代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <string>

class Solution
{
public:
    void moveZeroes(std::vector<int> &nums)
    {

        if (0 == nums.size())
        {
            std::cout << "error nums isize is 0!" << std::endl;
            return;
        }

        for (int i = nums.size() - 1; i > -1; --i)
        {
            if (0 == nums[i])
            {
                auto it = nums.begin() + i;
                nums.erase(it);
                nums.push_back(0);
            }
        }
    }
};

int main()
{
    std::vector<int> nums{0, 0, 0, 3, 12};
    Solution test;
    test.moveZeroes(nums);
    //打印std::vector<int> nums
    for (auto &num : nums)
    {
        std::cout << "muns is:" << num << std::endl;
    }

    return 0;
}

知识点 C++ std::swap详细解释

std::swap 是 C++ 标准库中的一个函数模板,位于 头文件中。它用于交换两个对象的值。

std::swap 的函数原型如下:

template< class T >
void swap( T& a, T& b );
std::swap 接受两个参数 a 和 b,它们可以是任意类型的引用。通过调用 std::swap,a 和 b 的值会被交换。

以下是一个示例代码,演示如何使用 std::swap 交换两个变量的值:

#include <iostream>
#include <algorithm>

int main() {
    int a = 5;
    int b = 10;

    std::cout << "交换前:a = " << a << ", b = " << b << std::endl;

    std::swap(a, b);

    std::cout << "交换后:a = " << a << ", b = " << b << std::endl;

    return 0;
}

在上面的示例中,我们创建了两个整数变量 a 和 b,并将它们分别初始化为 5 和 10。然后,我们调用 std::swap(a, b) 来交换它们的值。最后,我们打印出交换后的结果。

std::swap 的实现会根据对象的类型使用最有效的交换方式。对于内置类型(如整数、浮点数等),它使用一种临时变量的方式进行交换。对于自定义类型,可以通过重载 operator= 或提供自定义的交换函数来实现高效的交换操作。

需要注意的是,std::swap 是一个通用的交换函数,可以用于多种类型的对象。它是通过传引用的方式工作,因此可以直接修改传入的对象。这使得 std::swap 在交换大型对象时更高效,因为它避免了复制对象的开销。

总结而言,std::swap 是一个方便且高效的函数模板,用于交换两个对象的值。它是 C++ 标准库提供的一个常用工具函数,可以在许多情况下简化代码并提高性能。

以下是一个使用 std::swap 的示例代码,针对 std::vector 对象进行值交换:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3};
    std::vector<int> vec2 = {4, 5, 6};

    std::cout << "交换前:" << std::endl;
    std::cout << "vec1: ";
    for (int num : vec1) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::cout << "vec2: ";
    for (int num : vec2) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::swap(vec1, vec2);

    std::cout << "交换后:" << std::endl;
    std::cout << "vec1: ";
    for (int num : vec1) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::cout << "vec2: ";
    for (int num : vec2) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们创建了两个 std::vector 对象:vec1 和 vec2,并分别初始化它们的元素。然后,我们调用 std::swap(vec1, vec2) 来交换两个向量的值。最后,我们打印出交换后的结果。

std::swap 在交换 std::vector 对象时,会交换它们的内部存储,而不是逐个元素地交换。这样可以避免复制大量元素的开销,提高交换的效率。

需要注意的是,std::swap 可以用于交换任意类型的对象,不仅限于 std::vector。无论是内置类型还是自定义类型,只要满足可复制或可移动的要求,都可以使用 std::swap 进行值交换。

要交换一个 std::vector 结构中的第3个元素和第5个元素,可以使用 std::swap 函数来交换它们的值。

以下是一个示例代码,演示如何交换 std::vector 结构中的元素:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    std::cout << "交换前:" << std::endl;
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::swap(vec[2], vec[4]);

    std::cout << "交换后:" << std::endl;
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

在上面的示例中,我们创建了一个 std::vector 对象 vec,并初始化它的元素。然后,我们使用 std::swap 函数来交换 vec 中的第3个元素和第5个元素,即 vec[2] 和 vec[4]。最后,我们打印出交换后的结果。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月07日 0

暂无评论

0okL55w8xmzg