首页 > 其他分享 >LeetCode 283. 移动零

LeetCode 283. 移动零

时间:2023-10-24 22:04:14浏览次数:40  
标签:p1 nums ++ fast 我们 数组 283 移动 LeetCode

移动零

题目链接 283. 移动零

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

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

示例 1:

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

示例 2:

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

题目解释

这道题目的意思是我们将所有的0都移动到数组的后面,非零的元素放在前面.不过我们在移动的时候是不能够改变我们的非零元素的相对的位置的.

算法原理

这里我们可以很容易想到一个解法,我们新开辟一个数组,遍历一下我们原来的数组,如果不是零,就添加.最后将0放在我们数组的后面就可以了,下面是我们基本的想法.

vector<int> new_arr(num.size(), 0);
int index = 0;
for(i = 0; i < num.size(); ++i)
{
    if(num[i] != 0) new_arr[index++] = num[i];
}

但是,这里我们使用了一个另外的空间,不太符合题意.但是这里我们得到一个想法,下面是两个数组.

image-20231022204129890

指针p1是一定不会小于p2的,那么此时我们是否可以这样想,我们让p2也是指向arr,将p1遇到的各个情况经过分析,然后赋值到p2

  • p1 指向的位置是 0
  • p1 指向的位置非 0

对于p1 非0,那么我们直接赋值,然后让p1和p2 分别自增.如果我们遇到p1是0了,那么我们不关心,让p1自增.

细节补充

这里我们谈两个

  • 我们循环的条件,按照我们的原本的想法,p1是小于我们的arr的长度的
  • 当我们循环结束后,是否是立即返回?不是的,我们需要将p2位置和后面都赋值给0.

代码编写

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int fast = 0;
        int slow = 0;
        while(fast < nums.size())
        {
            if(nums[fast] != 0)
            {
                nums[slow++] = nums[fast];
            }
            fast++;
        }
        while(slow < nums.size())
        {
            nums[slow++] = 0;
        }
    }
};

标签:p1,nums,++,fast,我们,数组,283,移动,LeetCode
From: https://blog.51cto.com/byte/8010216

相关文章

  • LeetCode 1089. 复写零
    复写零题目链接1089.复写零给你一个长度固定的整数数组arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组就地进行上述修改,不要从函数返回任何东西。示例1:输入:arr=[1,0,2,3,0,4,5,0]输......
  • LeetCode 202. 快乐数
    快乐数题目链接202.快乐数编写一个算法来判断一个数n是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为1,也可能是无限循环但始终变不到1。如果这个过程结果为1,那么这个数就是快乐......
  • LeetCode 11. 盛最多水的容器
    盛水最多的容器题目链接11.盛最多水的容器给定一个长度为n的整数数组height。有n条垂线,第i条线的两个端点是(i,0)和(i,height[i])。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。**说明:**你不能倾斜容器......
  • LeetCode 611. 有效三角形的个数
    有效三角形的个数题目链接611.有效三角形的个数给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。示例1:输入:nums=[2,2,3,4]输出:3解释:有效的组合是:2,3,4(使用第一个2)2,3,4(使用第二个2)2,2,3示例2:输入:nums=[4,2,......
  • [Leetcode] 0100. 相同的树
    100.相同的树题目描述给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例1:输入:p=[1,2,3],q=[1,2,3]输出:true示例2:输入:p=[1,2],q=[1,null,2]输出:false示例3:......
  • 移动端自动化知识内容
      ......
  • 如何在移动终端上安装kali系统
    一、起因  很久之前,移动端的终端软件出来的时候,感觉很是新奇,再加上对linux的浓烈兴趣,于是一是兴起,就玩了一会,还记的那款软件叫busybox,当时印象很是深刻,后面又断断续续玩过几次,似乎都没什么成果,感到很是遗憾,于是乘近期有时间,重新拿起,顺便学习一下网络安全相关的知识!接下来,小编带你......
  • vue移动鼠标在canvas上画不规则图形(整合别人的,增加了一些功能)
    1、draw_shape.js1/**2*绘制不规则多边形3*/45import{Message}from'element-ui'67exportfunctiondraw_test(cav,list){8//画布初始化9letctx=cav.getContext('2d')10ctx.strokeStyle='red'11......
  • LeetCode Day13 239&347
    //利用双端队列手动实现单调队列/***用一个单调队列来存储对应的下标,每当窗口滑动的时候,直接取队列的头部指针对应的值放入结果集即可*单调队列类似(tail-->)3-->2-->1-->0(-->head)(右边为头结点,元素存的是下标)*/239. 滑动窗口最大值classSolution{......
  • LeetCode 454.四数相加 II
    题目描述给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0描述第一次提交的代码importjava.util.Map;importjava.util.HashMap;classSol......