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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java架构师分布式搜索词库解决方案

目录 1 IK分词器字典热加载实现思路2 分析IK分词器的配置3 基于MySQL更新字典的实现4 常见报错4.1 java.lang.ExceptionInInitializerError: null …access denied (“java.lang.RuntimePermission” “setContextClassLoader”)4.2 java.sql.SQLNonTransientConnectionExcepti…

OpenGL的学习之路-3

前面1、2介绍的都是glut编程 下面就进行opengl正是部分啦。 1.绘制点 #include <iostream> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h>void myMainWinDraw();int main(int argc,char** argv) {glutInit(&argc,argv);glutIni…

windows构建ROS2 Android App

windows构建ROS2 Android App 升级到ROS2之后,由于架构的不同,导致ROS1的Android App已经无法使用了,所以我们需要通过ROS2 java构建出Android的依赖库 环境要求 window10以上wsl(我用的是WSL构建的,你也可以用linux虚拟机)docker(安装的时候选择WSL)Ubuntu 18.04以上…

基于谐波参数空间的卷积神经网络自动三维牙齿分割

论文连接&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1524070320300151 机构&#xff1a; a英国卡迪夫大学计算机科学与信息学院 b中国科学院大学北京 c中国科学院计算技术研究所北京 d深圳大数据研究院&#xff0c;深圳518172 代码链接&#x…

本机IP地址查询指令详解

本机IP地址是指在局域网内的计算机的私有IP地址&#xff0c;它是连接网络的基础。了解本机IP地址与相关指令的使用方法&#xff0c;在网络维护以及安全等方面都具有重要的意义。 一、查看本机IP地址 不同的操作系统使用不同的指令来查看本机IP地址。以下是一些常用操作系统的指…

Window MongoDB安装

三种NOSQL的一种,Redis MongoDB ES 应用场景: 1.社交场景:使用Mongodb存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人,地点等功能 2.游戏场景:使用Mongodb存储游戏用户信息,用户的装备,积分等直接以内嵌文档的形式存储,方便查询,高效率存储和访问…

保姆级vue-pdf的使用过程

第一步 引入vue-pdf npm install --save vue-pdf 第二步 按照需求我们慢慢进行 01.给你一个pdf文件的url&#xff0c;需要在页面渲染 代码 <template><div><pdfref"pdf":src"url"></pdf></div> </template> <…

灰度图处理方法

做深度学习项目图像处理的时候常常涉及到灰度图处理&#xff0c;这里对自己处理灰度图的方式做一个记录&#xff0c;后续有更新的话会在此更新 一&#xff0c;多维数组可视化 将多维数组可视化为灰度图 img_gray Image.fromarray(img, modeL) # 实现array到image的转换,m…

大数据-之LibrA数据库系统告警处理(ALM-12043 DNS解析时长超过阈值)

告警解释 系统每30秒周期性检测DNS解析时长&#xff0c;并把DNS解析时长和阈值&#xff08;系统默认阈值20000ms&#xff09;进行比较&#xff0c;当检测到DNS解析时长连续多次&#xff08;默认值为2&#xff09;超过阈值时产生该告警。 用户可通过“系统设置 > 阈值配置 …

深度学习 机器视觉 车位识别车道线检测 - python opencv 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

openEuler安全配置规范基线

# openEuler安全配置规范基线 ## 概述 安全配置规范基线是对系统配置项的推荐安全配置的集合&#xff0c;包含一系列的配置要求或建议&#xff0c;各配置项之间相互独立或存在一定的关联关系。基于安全配置规范基线指导修改系统配置&#xff0c;可以显著提升系统的整体安全防护…

Python算法——树的重建

Python中的树的重建算法详解 树的重建&#xff08;Tree Reconstruction&#xff09;是一种从给定的遍历序列中恢复原树结构的算法。在本文中&#xff0c;我们将讨论树的重建问题以及常见的重建算法&#xff0c;包括先序遍历和中序遍历序列重建二叉树&#xff0c;以及层序遍历序…

使用 Electron 来替代本地调试线上代理的场景

Cookie Samesite 问题 https://developers.google.com/search/blog/2020/01/get-ready-for-new-samesitenone-secure?hlzh-cnhttps://www.chromium.org/updates/same-site/https://github.com/GoogleChromeLabs/samesite-exampleshttps://releases.electronjs.org/releases/s…

python3中split()函数和int()函数的坑

&#xff08;一&#xff09; python3中的split()函数如果传入一个空字符&#xff0c;就会返回一个列表&#xff0c;该列表中有一个元素&#xff0c;此元素为空字符串。见如下代码&#xff0c; a "".split(",") for i,x in enumerate(a):print(f"i{i…

如何使用 docker 在本地部署 vite 项目

如何使用 docker 在本地部署 vite 项目 创建 Dockerfile 文件创建.dockerignore 文件构建镜像运行容器 1. 创建 Dockerfile 文件 # 使用官方的 Node 镜像作为基础镜像 FROM node:16.15.1# 设置工作目录 WORKDIR /usr/src/app# 将本地的 Vite 项目文件复制到工作目录 COPY . …

PieCloudDB Database 自研内存管理器 ASanAlloc:为产品质量保驾护航

内存管理是计算机科学中至关重要的一部分&#xff0c;它涉及到操作系统、硬件和软件应用之间的动态交互。有效的内存管理可以确保系统的稳定性和安全性&#xff0c;提高系统运行效率&#xff0c;帮助我们最大限度地利用有效的内存资源&#xff0c;合理分配和回收内存&#xff0…

【SQLite】的使用及指令| 编程操作(增删改查)

一、SQLite 使用和指令集 SQLite 的基本使用SQL 命令 二、常见的 SQL 数据类型 三、SQLite的命令用法 四、SQLite的编程操作 五、sqlite3_open函数 六、sqlite3_close函数 七、sqlite3_errcode函数 八、SQLite C Interface 九、sqlite3_exec函数 十、callback回调函数 十一、…

YOLOV5----修改损失函数-ShuffleAttention

主要修改yolo.py、yolov5s.yaml及添加ShuffleAttention.py 一、ShuffleAttention.py import numpy as np import torch from torch import nn from torch.nn import init from torch.nn.parameter import Parameterclass ShuffleAttention(nn.Module):def

RemoteWebDriver 远程启动Driver版本问题

由于系统部署原因&#xff0c;本地调试UI自动化脚本的时候&#xff0c;页面加载非常慢&#xff01;于是想在远程虚拟机上启动浏览器来执行操作。 下载了selenium-server-4.15.0.jar &#xff0c;并在远程机器上启动&#xff0c;CMD里执行java -jar selenium-server-4.15.0.jar …

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…