優選算法|【雙指針】|1089.復寫零

目錄

題目描述

題目解析

算法原理講解

代碼


題目描述

1089. 復寫零

給你一個長度固定的整數數組?arr?,請你將該數組中出現的每個零都復寫一遍,并將其余的元素向右平移。

注意:請不要在超過該數組長度的位置寫入元素。請對輸入的數組?就地?進行上述修改,不要從函數返回任何東西。

示例 1:

輸入:arr = [1,0,2,3,0,4,5,0]
輸出:[1,0,0,2,3,0,0,4]
解釋:調用函數后,輸入的數組將被修改為:[1,0,0,2,3,0,0,4]

示例 2:

輸入:arr = [1,2,3]
輸出:[1,2,3]
解釋:調用函數后,輸入的數組將被修改為:[1,2,3]

提示:

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 9

題目解析

????????題目意思就是遇到0了再寫一遍0,其他元素向右平移就行。只能在原來數組上修改,也就是空間復雜度為0.

算法原理講解

????????一般像這種在數組中移動一些數的題目,也是用雙指針算法來解決這個問題。

????????雙指針算法是根據異地解法的操作,優化成雙指針的就地操作。

異地操作

異地操作就是,重新開辟一個數組。

????????定義兩個指針,cur用來掃描原數組,dest用來更新新數組。

????????當cur對應的值不等于0時,dest更新一個數,將cur值直接填入dest的位置,dest++,cur++就行。

????????當cur對應的值等于0時,dest指針更新兩個數,都填入0,cur++就行。

????????當dest=arrSize就結束了。

就地操作

????????就是不用重新開辟數組,也就是題目要求的那樣,我們可以把cur和dest這兩個指針,都放在原數組上。

? ? ? ?用雙指針解決復寫問題的步驟

1.找到最后一個復寫的數

2.從后向前完成復寫

????????讓cur指向最后一個復寫的數,對于[1,0,2,3,0,4,5,0]這個數組,最后一個復寫的數是4,所以讓cur指向4 ,best指向最后一個位置就行。

cur指向的這個數是非零的,所以復寫一次就行,復寫完后,cur--,dest--。

這次cur指向0,那就復寫兩次,后cur--。

從圖中可以看出,當cur和dest都指向-1的時候就復寫完成了。

接下來有一個問題就是?——怎么找到最后一個復寫的數

????????還是利用雙指針算法,定義兩個指針cur和dest,cur用來掃描數組,dest用來標識最后一個復寫的數。

cur指向的值決定dest向后移動兩步還是移動一步

1.先判斷cur里面的值

2.決定dest走兩步還是走一步

3.在判斷dest到沒到結尾

4.沒到結尾再cur++

????????咱們一步一步來,arr[cur]現在指向了1,所以dest走一步到達下標為0的位置,dest沒有走到結尾,所以cur++。

arr[cur]現在指向了0,所以dest走兩步到達下標為2的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了2,所以dest走一步到達下標為3的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了3,所以dest走一步到達下標為4的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了0,所以dest走兩步到達下標為6的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了4,所以dest走一步到達下標為7的位置,dest走到結尾返回cur。

????????對于這個數組這種方法是剛好的,那么如果是【1,0,2,3,0,4】

arr[cur]現在指向了1,所以dest走一步到達下標為0的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了0,所以dest走兩步到達下標為2的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了2,所以dest走一步到達下標為3的位置,dest沒有走到結尾所以cur++。

arr[cur]現在指向了3,所以dest走一步到達下標為4的位置,dest沒有走到結尾所以cur++。

?????????arr[cur]現在指向了0,所以dest走兩步到達下標為6的位置,但是這個數組沒有下標6最大直到5,所以會產生越界。

????????接下來,我們怎么解決這個問題,我們要明白越界是怎么產生的,是因為復寫0,復寫兩次就產生了越界。這個情況我們單獨處理一下。

那么怎么處理呢?我們在復寫的時候將最后一個位置,和越界的那個位置都復寫成0。但是越界那個位置不能修改成0,我們只需要把最后一個位置修改成0(直接在這里復寫),也就是arr[arrSzie-1]=0,就可以。

修改之后我們將dest向前移動兩步,cur向前移動一步

cur現在就是最后一個復寫的值,接下來復寫就從dest現在的位置開始復寫。

代碼

void duplicateZeros(int* arr, int arrSize) {//找到最后一個復寫的位置int cur=0;int dest=-1;while(cur<arrSize){if(arr[cur]==0)dest+=2;if(arr[cur]!=0)dest+=1;//如果dest到達最后一個位置就跳出循環//如果剛好的話是等于arrSzie-1,有越界的時候是等于arrSizeif(dest==arrSize-1||dest==arrSize)break;cur++;}//處理邊界if(dest==arrSize){arr[arrSize-1]=0;cur-=1;dest-=2;}while(cur>=0&&dest>=0){if(arr[cur]==0){arr[dest--]=arr[cur];arr[dest--]=arr[cur--];}else{arr[dest--]=arr[cur--];}}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716401.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716401.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716401.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode受限條件下可到達節點的數目

題目描述 現有一棵由 n 個節點組成的無向樹&#xff0c;節點編號從 0 到 n - 1 &#xff0c;共有 n - 1 條邊。 給你一個二維整數數組 edges &#xff0c;長度為 n - 1 &#xff0c;其中 edges[i] [ai, bi] 表示樹中節點 ai 和 bi 之間存在一條邊。另給你一個整數數組 restr…

OJ:移除鏈表元素

203. 移除鏈表元素 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;這個題可以直接在原鏈表上進行修改&#xff0c;但是修改鏈表的指向是有點麻煩的&#xff0c;所以我們給兩個指針&#xff0c;phead和ptail,這是新鏈表的兩個指針&#xff0c;再給一個指針pcur來遍歷…

Java和JavaScript區別

1. Java和javaScript都是面向對象語言 2. 他兩除了名字相似之外沒有任何關系 3. Java是一種真正的面向對象語言&#xff0c;不管開發什么程序都要設計對象&#xff1b;而JavaScript是種腳本語言&#xff0c;主要實現前端頁面的交互&#xff0c;比如驗證表單&#xff0c;彈窗提…

Sqli-labs靶場第12關詳解[Sqli-labs-less-12]

Sqli-labs-Less-12 #手工注入 post傳參了 根據題目看&#xff0c;像一個登錄頁面&#xff0c;嘗試使用布爾型盲注測試能否登錄網站 1. Username輸入a a" 測試是否會有報錯&#xff0c;burp抓包 報錯&#xff1a;syntax to use near "a"") and passw…

消息中間件之RocketMQ源碼分析(二十七)

Broker提交或回滾事務消息 當生產者本地事務處理完成并且Broker回查事務消息后&#xff0c;不管執行Commit還是Rollback,都會根據用戶本地事務的執行結果發送一個End_transaction的RPC請求給Broker&#xff0c;Broker端處理該請求的類是EndTransactionProcessor 第一步&…

volatile 關鍵字 (一)

volatile 關鍵字 &#xff08;一&#xff09; 文章目錄 volatile 關鍵字 &#xff08;一&#xff09;如何保證變量的可見性&#xff1f;如何禁止指令重排序&#xff1f; 文章來自Java Guide 用于學習如有侵權&#xff0c;立即刪除 如何保證變量的可見性&#xff1f; 在 Java 中…

【Linux安裝軟件命令及vim、gcc使用說明】

安裝軟件命令 Linux安裝軟件的命令首先要進入管理員權限 首先在終端輸入sudo su切換到管理員界面 輸入對應的密碼&#xff0c;注意這里的密碼不會顯示出來&#xff0c;輸完密碼之后回車即可。當出現root就代表已經是管理員界面了。 如果相應退出管理員界面輸入exit即可。 注…

django-paramiko遠程服務器和文件管理(五)

一、paramiko簡介 1.paramiko是一個基于SSHv2協議的純Python庫。需要單獨安裝。 2.它提供了客戶端和服務器的功能。 3.可以實現SSH2遠程安全連接&#xff0c;支持用戶名、密碼連接&#xff0c;也支持密鑰連接 4.一般用于執行遠程命令、傳輸文件、中間SSH代理等 安裝 pip3 in…

數組、冒泡排序、函數、作用域、對象、Math

數組 1.定義數組&#xff1a; a)通過字面量的方式定義數組 let ary[1,2,3,4]b)通過定義構造函數的方式定義數組&#xff1a; let 數組名new Array(值,值,值);數組的操作方式 a)增 //在數組末尾添加值 arr.push(新增的內容) //在數組的開始添加值 arr.unshift(新增的內容)b…

Redis主從復制+Redis哨兵模式+Redis群集模式

Redis主從復制Redis哨兵模式Redis群集模式一、Redis主從復制1、主從復制的作用2、主從復制過程3、搭建Redis主從復制3.1 所有節點服務器安裝redis3.2 修改Redis配置文件(Master節點操作)3.3 修改Redis配置文件(Slave節點操作)3.4 驗證主從效果 二、Redis哨兵模式1、哨兵模式的作…

8、IBOScms代碼審計

一、sql注入 1、sql注入(Ⅰ) 限制 rreport/api/getlist {"offset":0,"type":"send","keyword":{"subject":"111) AND (updatexml(1,concat(0x7e,(select user()),0x7e),1))-- qw"}}復現 POST /?rreport/api/…

Vue開發實例(十一)用戶列表的實現與操作

用戶列表的實現與操作 一、創建用戶頁面和路由二、表格優化1、表頭自定義2、表格滾動3、加入數據索引4、利用插槽自定義顯示 三、功能1、查詢功能3、增加4、刪除5、修改 一、創建用戶頁面和路由 創建用戶頁面 在 src/components/Main 下創建文件夾user&#xff0c;創建文件Us…

Java ZooKeeper-RocketMQ 面試題

Java ZooKeeper-RocketMQ 面試題 前言1、談談你對ZooKeeper的理解 &#xff1f;2、Zookeeper的工作原理&#xff08;Zab協議&#xff09;3、談談你對分布式鎖的理解&#xff0c;以及分布式鎖的實現&#xff1f;4、 zookeeper 是如何保證事務的順序一致性的&#xff1f;5、 zook…

設計模式之策略模式詳解

目錄 什么是策略模式 應用場景 業務場景實現 抽象類 實現類 Context上下文 測試類 策略模式的優缺點 什么是策略模式 他將定義的算法家族、分別封裝起來&#xff0c;讓他們之間可以相互替換&#xff0c;從而讓算法的變化不會影響到使用算法的用戶。 策略模式使用的就是…

idea出現莫名其妙錯的時候

正常情況idea使用起來都很順手&#xff0c;但是當項目比較多的時候&#xff0c;可能出現莫名奇妙的錯誤&#xff0c;比如導入的包始終報錯java: 程序包com不存在&#xff0c;或者引入自己寫的包也不存在&#xff0c;或者始終出現紅線但是排查之后沒有問題的情況&#xff0c;這種…

進來吧,給自己10分鐘,這篇文章帶你直接學會python

Python的語言特性 Python是一門具有強類型(即變量類型是強制要求的)、動態性、隱式類型(不需要做變量聲明)、大小寫敏感(var和VAR代表了不同的變量)以及面向對象(一切皆為對象)等特點的編程語言。 獲取幫助 你可以很容易的通過Python解釋器獲取幫助。如果你想知道一個對象(o…

OJ:鏈表的中間結點

876. 鏈表的中間結點 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a;首先最容易想到的思路是什么呢&#xff0c;就是先遍歷一遍鏈表&#xff0c;用一個值count來記錄鏈表的長度&#xff0c;然后我們運用除法&#xff0c;/2&#xff0c;結果是幾&#xff0c;就…

【C++干貨基地】揭秘C++11常用特性:內聯函數 | 范圍for | auto自動識別 | nullptr指針空值

&#x1f3ac; 鴿芷咕&#xff1a;個人主頁 &#x1f525; 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想&#xff0c;就是為了理想的生活! 引入 哈嘍各位鐵汁們好啊&#xff0c;我是博主鴿芷咕《C干貨基地》是由我的襄陽家鄉零食基地有感而發&#xff0c;不知道各位的…

平臺工程: 用Backstage構建開發者門戶 - 2

本文介紹了如何使用開源Backstage構建自己的開發者門戶&#xff0c;并基于此實踐平臺工程。本系列共兩篇文章&#xff0c;這是第二篇。原文: Platform Engineering: Building Your Developer Portal with Backstage — Part 2 在本教程第一部分中我們了解了Backstage這個用于構…

外貿網站模板建站

測繪檢測wordpress外貿主題 簡潔實用的wordpress外貿主題&#xff0c;適合做測繪檢測儀器設備的外貿公司使用。 https://www.jianzhanpress.com/?p5337 白馬非馬衣服WordPress外貿建站模板 白馬非馬服裝行業wordpress外貿建站模板&#xff0c;適用于時間服裝企業的官方網站…