力扣学习笔记——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> numsfor (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]。最后,我们打印出交换后的结果。