正版网站设计制作,小红书流量推广,重庆网站建设公司多少钱,js网站记住密码怎么做力扣学习笔记——283. 移动零
题目描述
https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2envIdtop-100-liked
给定一个数组 nums#xff0c;编写一个函数将所有 0 移动到数组的末尾#xff0c;同时保持非零元素的相对顺序。
请注意 study-plan-v2envIdtop-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(vectorint nums) {if (0nums.size()){std::couterror nums isize is 0!std::endl;return;}for(int inums.size()-1;i-1;--i){if (0nums[i]){auto it nums.begin() i;nums.erase(it);nums.push_back(0);}}}
};速度很快的一个解法——使用swap交换
class Solution {
public:void moveZeroes(std::vectorint nums) {int cur 0, dest -1;while (cur nums.size()){ if (nums[cur]){std::swap(nums[dest], nums[cur]);}cur;}}
};我自己根据这个方式写的 void moveZeroes(std::vectorint nums) {//有任意一个非零值就往左边第一个非零值后一位移动int un_zero_index 0;for (int i 0; inums.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 stringclass Solution
{
public:void moveZeroes(std::vectorint 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::vectorint nums{0, 0, 0, 3, 12};Solution test;test.moveZeroes(nums);//打印std::vectorint 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::swapa 和 b 的值会被交换。
以下是一个示例代码演示如何使用 std::swap 交换两个变量的值
#include iostream
#include algorithmint 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 algorithmint main() {std::vectorint vec1 {1, 2, 3};std::vectorint 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 algorithmint main() {std::vectorint 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]。最后我们打印出交换后的结果。