博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动零(方1:利用vector erase实现,方2:利用双指针思想实现)
阅读量:3942 次
发布时间:2019-05-23

本文共 1175 字,大约阅读时间需要 3 分钟。

题目:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。

分析:

方法一: 直接遍历,遇到0就删除,并在数组末尾添加见代码1
方法二: 与相似,方法一比较耗时,如果能够只针对非0元素进行移动,将其放到前面,时间复杂度能降低一级;见代码2,利用一个replace指针指向当前选一个替换的位置;
方法三: 遍历数组,replace指针指向遇到 第一个0 元素,此时向后遍历遇到的下一个非0元素,与replace指针指向进行交换;并记录当前非零元素位置;replace指针指向下一个 0 元素;
重复上述过程,并使用记录下来的非零元素位置开始寻找下一个非0元素;(与方法二的实现类似

代码1:ac

class Solution {
public: void moveZeroes(vector
& nums) {
int m = nums.size(); if(!m) return; for(int i = 0; i < m; i++) {
if(nums[i] == 0){
nums.erase(nums.begin() +i); nums.push_back(0); i--;m--; } } }};

代码2:ac

在这里插入图片描述

class Solution {
public: void moveZeroes(vector
& nums) {
int m = nums.size(), replace = 0; // [0,1,0,3,12] 第一次遍历将前面所有的元素都换成非0的 for(int i = 0; i < m; i++) {
if(nums[i] != 0){
nums[replace++] = nums[i]; } } for(int i = replace; i < m; i++){
// 第二次遍历将剩下的元素都置为0 nums[i] = 0; } }};

转载地址:http://zpzwi.baihongyu.com/

你可能感兴趣的文章
vmware安装ubuntu系统时不能看到共享文件的问题
查看>>
ffmpeg源码分析之媒体打开过程
查看>>
去除vim ^M符号
查看>>
Linux下编译带x264的ffmpeg的方法
查看>>
用ffmpeg转多音轨的mkv文件
查看>>
ubuntu12.04 安装VLC,在root用户下不能使用的问题
查看>>
简单而又完整的Makefile
查看>>
GNU/Linux下如何卸载源码安装的软件
查看>>
ffmpeg 常用 命令随手记
查看>>
av_seek_frame中flags值的意义
查看>>
git 学习笔记
查看>>
C++类中的static的用法
查看>>
vector 释放内存 swap
查看>>
在linux下新增一块硬盘的操作。(包含大于2T的硬盘在linux下挂载操作)
查看>>
对SIGPIPE等软中断信号的处理方式
查看>>
在QT中增加makefile编译宏的方法
查看>>
在32位系统中使用fseek和lseek或fwrite、write写大文件时,最大只能写2G左右的解决办法
查看>>
动态库提示file too short的错误。
查看>>
PS结构-提取数据帧
查看>>
各类文件头信息
查看>>