算法专栏——双指针

news/2024/7/7 15:19:54/文章来源:https://blog.csdn.net/kaiwawah/article/details/132654664

1.移动零

        

题目链接:移动 0_牛客题霸_牛客网 (nowcoder.com)

算法原理:

        像这样子的将一整块数组划分很多部分可以称为数组划分,常用的解法可以是双指针。

说是双指针,但操作的对象是数组,因此下标就是指针。 

        双指针的精华就是通过俩个指针将数组划分成三个部分:

那我们让其这个规则贯彻就完成了

想要保证上述划分的区域不变的话,那就可以这样做:

        先让left指向 -1 ,right进行扫描整个数组。

        right遇到0继续++,遇到非0的话,然后swap(nums[left+1] ,nums[right]left++, right++

    public int[] moveZeroes (int[] nums) {// write code hereint left = -1;int right = 0;for(int i = 0;i < nums.length;i++){if(nums[right] == 0){right++;}else{swap(left+1,right,nums);left++;right++;}}return nums;}public void swap(int left,int right,int[] nums){int num = nums[left];nums[left] = nums[right];nums[right] = num;}

2.复写零

        

算法原理: 

        看到这个题第一个想到的是:创建一个新的数组,遍历原数组然后普通数字直接复制到新数组上,0就复制俩次呗。

        但是有没有可以实现在这数组上直接进行操作呢?

        我们先从前往后试着模拟一下:

        我们发现left会往前越过right,并且覆盖掉了 2这显然不可以的,那我们就试着从后往前遍历。

        那如果从后往前遍历的话,right指标肯定要先指向原数组最后的一个位置就比如上述的数据,right应该指向 val数据是 4 。left指向的是最后的元素。然后往前进行遍历,就不会出现覆盖的情况了。

        那就还有个问题,就是如何找到原数组最后出现的数呢?也可以用双指针从前往后,找到right最后的位置,然后left不需要进行换数据啥的,主要就是为了找到位置。


具体的步骤如下:

        

        

 

public void duplicateZeros(int[] arr) {//1.先找到原数组最后出现的位置 right就是目标位置int n = arr.length;int top = 0;int i = -1;while(top < n){i++;if(arr[i] != 0){top++;}else{top += 2;}}//边界问题int j = n - 1;if(top == n + 1){arr[j] = 0;j--;i--;}//从后往前遍历while(j >= 0){arr[j] = arr[i];j--;if(arr[i] == 0){arr[j] = arr[i];j--;}i--;}}

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

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

相关文章

【LeetCode】剑指 Offer <二刷>(6)

目录 题目&#xff1a;剑指 Offer 12. 矩阵中的路径 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 13. 机器人的运动范围 - 力扣&#…

Linux的命令

Linux的命令分为四个类型&#xff1a;文件操作命令、系统操作命令、文本处理命令和网络操作命令。下面简单介绍一下常用的Linux命令&#xff1a; 文件操作命令 ls&#xff1a;列出目录下的所有文件和目录。 cd&#xff1a;切换当前目录。 mkdir&#xff1a;创建一个新目录。…

在公网上使用SSH远程连接安卓手机Termux:将Android手机变身为远程服务器

文章目录 前言1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 前言 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不过我们可以开启ssh&#xff0c;使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在…

zabbix监控平台部署

目录 前言 一、zabbix的基本概述 &#xff08;一&#xff09;、zabbix的工作流程 &#xff08;二&#xff09;、zabbix的构成 &#xff08;三&#xff09;、zabbix的监控对象 &#xff08;四&#xff09;、zabbix的常用术语 &#xff08;五&#xff09;、zabbix进程详解…

如何高效的解析Json?

Json介绍 Json是一种数据格式&#xff0c;广泛应用在需要数据交互的场景Json由键值对组成每一个键值对的key是字符串类型每一个键值对的value是值类型(boo1值数字值字符串值)Array类型object类型Json灵活性他可以不断嵌套&#xff0c;数组的每个元素还可以是数组或者键值对键值…

三维跨孔电磁波CT数据可视化框架搭建

三维跨孔电磁波CT数据可视化框架搭建 文章目录 三维跨孔电磁波CT数据可视化框架搭建1、三维CT可视化结果2、matlab代码2.1、CT数据格式整理并保存2.2、三维可视化 利用matlab实现对跨孔电磁波CT实测数据反演&#xff0c;并搭建了三维CT数据可视化框架&#xff0c;可装填实测CT反…

图解SQL查询之分组聚合技巧:如何使用GROUP BY对数据进行分组

在 SQL 中&#xff0c;分组聚合是一种按照指定的列对数据进行分组&#xff0c;并对每个分组应用聚合函数&#xff08;如COUNT、SUM、AVG等&#xff09;以获取汇总结果的操作。 以下是用到的表 例如&#xff0c;要求计算每个班级的总年龄。

什么是接口测试,如何做接口测试?

比起点点点的功能测试&#xff0c;“接口测试”显得专业又高大上&#xff0c;也因此让有些初级测试人员“望而生畏”。别担心&#xff0c;其实接口测试也是功能测试的一种&#xff0c;它是针对接口进行的功能测试。 写在前面&#xff1a;本文参考了茹炳晟老师的《测试工程师 全…

2023-9-4 欧拉函数

题目链接&#xff1a;欧拉函数 #include <iostream>using namespace std;int main() {int n;cin >> n;while(n --){int x;cin >> x;int res x;for(int i 2; i < x / i; i){if(x % i 0){res res / i * (i - 1); // 公式 N * (1 - 1 / p1) * (1 - 1/ p2…

wireshark抓包分析

题目一&#xff1a;Cephalopod(图片提取) 打开下载好的数据包&#xff1a;CtrlF 按照如图选择分组字节流&#xff0c;选择字符串&#xff0c;输入‘flag’筛选出数据包&#xff1b; 点击筛选出来的一条数据包&#xff0c;右键选择追踪tcp流&#xff1b; 然后可以看到png的字样…

基于QEMU的vexpress-a9开发调试环境搭建

准备工作 如果是window环境&#xff0c;则建议安装virtual box或vmware以便安装linux ubuntu。在ubuntu上安装必要工具&#xff1a; sudo adb install qemu-system-arm gdb-multiarch libnl-3-dev libncurses5-dev binutils-arm-linux-gnueabi gcc-arm-linux-gnueabi 编译ker…

云原生Kubernetes:Kubeadm部署K8S单Master架构

目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm&#xff0c;kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 …

基于sonar 的C#静态代码扫描使用总结

1.原理简介 C#语言接入Sonar代码静态扫描相较于Java、Python来说&#xff0c;相对麻烦一些。Sonar检测C#代码时需要预先编译&#xff0c;而且C#代码必须用MSbuid进行编译&#xff0c;如果需要使用SonarQube对C#进行代码质量分析&#xff0c;则需要Sonar-Scanner-MSBuild和MSBu…

入坑ThreadLocal,这一篇文章就够了

一、前言 很多 Java 开发一般都是做中台较多&#xff0c;并发编程使用的不多。因此&#xff0c;对 ThreadLocal 不太熟悉&#xff0c;所以笔者这里想让大家了解它&#xff0c;知道它是用来干什么的。 二、ThreadLocal 是用来干什么的 ThreadLocal 是 Java 中一种线程封闭技术…

睿趣科技:抖音小店多久可以做起来

随着社交媒体的迅猛发展&#xff0c;抖音成为了全球最受欢迎的短视频平台之一&#xff0c;吸引了数以亿计的用户。在抖音上&#xff0c;人们不仅可以分享自己的生活、才艺和创意&#xff0c;还可以创业经营抖音小店。但是&#xff0c;很多人都想知道&#xff0c;一个抖音小店到…

MySQL如何高效实现刷脏页,了解原理并学会配置

目录 一、什么是刷脏页 二、MySQL刷脏页的策略 三、MySQL刷脏页的实现原理 四、MySQL如何实现刷脏页 一、什么是刷脏页 在MySQL中&#xff0c;刷脏页是指将内存中已被修改的数据页&#xff08;也称为脏页&#xff09;写回到磁盘的过程。 当MySQL执行数据更新操作时&#…

【人工智能】—_一阶逻辑、量词的推理规则、一般化分离规则、合一、前向_反向链接算法、归结算法

文章目录 量词的推理规则全称量词实例化存在量词实例化 简化到命题逻辑推理Generalized Modus Ponens&#xff08;一般化分离规则&#xff09;举例 合一Forward chaining 前向链接算法示例 Backward chaining algorithm 反向链接算法一般FOL的FC/BC的完整性 归结算法归结推理规…

Marin说PCB之TDK和Murata电容哪家强?

不是各位朋友是否听说华为新款手机MATE60Pro已经开始发布销售了&#xff0c;小编我听到这个消息后很是震惊啊&#xff0c;这两年老美一直打压我们中国芯片行业的发展&#xff0c;而且拿华为开刀&#xff0c;搞了一些很恶心的手段来限制和打压华为的发展。所以当我听到新款的MAT…

git:一些撤销操作

参考自 如何撤销 Git 操作&#xff1f;[1] 一、撤销提交 git revert HEAD 撤销上次提交. (会在当前提交后面&#xff0c;新增一次提交&#xff0c;抵消掉上一次提交导致的所有变化,所有记录都会保留) 二、撤销某次merge git merge --abort 三、替换上一次提交 git commit --ame…

实例419 通过串口关闭对方计算机

实例说明 在网络应用程序中&#xff0c;主要通过网卡实现数据的传输&#xff0c;因此可以利用套接字技术实现远程关闭计算机。如果计算机中没有安装网卡&#xff0c;该如何实现远程关闭计算机呢&#xff1f;本例实现了利用串口关闭对方计算机&#xff0c;程序运行结果如图13.3所…