当前位置: 首页 > article >正文

双指针练习题移动零

previewfile_1962375063

283. 移动零

1.题目要求:

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

2.算法原理

数组划分/数组分块

解决: 双指针算法(利用数组下标来充当指针)

image-20240202203950750

cur => current: 当前的
dest => destination: 目的地

两个指针的作用:
cur: 从左往右扫描数组,遍历数组
dest: 已处理的区间内,非零元素的最后一个位置

image-20240202213444834

image-20240202221836398

三个区间:[0,dest], [dest+1,cur-1], [cur,n-1]
[0,dest]:非零元素
[dest+1,cur-1]:0元素
[cur,n]:待处理元素

image-20240202225702551

以示例1为例, nums = [0,1,0,3,12], 画图说明

image-20240203195128437

image-20240203200006664

image-20240203203600333

cur从前往后遍历的过程中:

  1. 遇到0元素: cur++;
  2. 遇到非零元素: swap(dest + 1, cur);/自定义的交互函数/ dest++,cur++;

3.编写代码

class Solution {
    public void moveZeroes(int[] nums) {
        for (int cur = 0, dest = -1; cur < nums.length; cur++) {
            if (nums[cur] != 0) {
                dest++;
                int tmp = nums[cur];
                nums[cur]=nums[dest];
                nums[dest]=tmp;
            }
        }
    }
}

4.运行结果

image-20240203205403716


http://www.kler.cn/a/226586.html

相关文章:

  • 1.27马尔科夫链,抽样蒙特卡洛模拟(逆转化方法,接受拒绝矩阵),马尔科夫链蒙特卡洛MCMC,隐马尔科夫(HMM(V算法剪枝优化),NLP)
  • [嵌入式系统-6]:龙芯1B 开发学习套件 -3-软件层次架构
  • 顺序表:数据结构的建筑积木
  • 【lesson8】高并发内存池Central Cache层释放内存的实现
  • Vue发送Get 和 Post 请求以及获取数据
  • 蓝桥杯---垒骰子
  • 如何快速记忆小鹤双拼键位图?
  • 对于软件测试的认识和了解
  • 【自然语言处理】P2 PyTorch 基础 - 张量
  • 02链表:1、两数之和
  • Dockerfile构建Nginx访问说明
  • 一文掌握单基因GSEA富集分析
  • 【Go】微服务架构下实现etcd服务注册与服务发现
  • VUE项目导出excel
  • Jmeter接口自动化测试(提取CSV文件遍历数据)
  • 基于springboot实现二次元商品购物系统项目【项目源码+论文说明】计算机毕业设计
  • 第二证券:苹果Vision Pro出货在即 固态电池产业化前景渐明
  • Vue2:请求接口的两种方式axios和vue-resource
  • Python Moviepy 视频编辑踩坑实录2:音频如何修改为单通道
  • 蓝桥杯省赛无忧 课件70 第九次学长直播带练配套课件