日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组OJ题

發(fā)布時(shí)間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组OJ题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 題目一
    • (1)描述
    • (2)示例
    • (3)思路
    • (4)代碼實(shí)現(xiàn)
  • 題目二
    • (1)描述
    • (2)實(shí)例
    • (3)思路
    • (4)代碼
  • 題目三
    • (1)描述
    • (2)示例
    • (3)思路

題目一

(1)描述

給你一個(gè)數(shù)組 nums 和一個(gè)值 val,你需要原地移除所有數(shù)值等于 val 的元素,并返回移除后數(shù)組的新長(zhǎng)度。

不要使用額外的數(shù)組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數(shù)組。元素的順序可以改變。你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。

(2)示例

輸入nums=[3,2,2,3],val=3 輸出nums=[2,2],數(shù)組長(zhǎng)度位2

(3)思路

采用雙指針法

  • 首先定義一個(gè)慢指針slow,并規(guī)定0-slow的元素的值都不是val

  • 2. 接著使用fast指針遍歷數(shù)組
    把fast所指向的元素與val進(jìn)行比較,就會(huì)產(chǎn)生兩種情況:所指元素值與val相等或者不相等fast
    3. 如果所指元素值與val相等(如上圖),由于我們規(guī)定o-slow是要存放值不為val的元素,所以fast指針后移,找尋下一個(gè)

    此時(shí)來到“2”這個(gè)元素,發(fā)現(xiàn)其值不是val,那么就要將其放入0-slow區(qū)間中,也即此時(shí)要把fast所指元素賦值給slow

    賦值完成后,slow指針就要向后移動(dòng)一下
    4. 重復(fù)上述步驟

    (4)代碼實(shí)現(xiàn)

    int removeElement(int* nums, int numsSize, int val) {int slow=0;int fast=0;for(fast=0;fast<numsSize;fast++){if(nums[fast]!=val){nums[slow]=nums[fast];slow++;}}return slow; }

    題目二

    (1)描述

    給定一個(gè)排序數(shù)組,你需要原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度
    不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。

    (2)實(shí)例

    輸入nums=[1,1,1,2,2,2,3] 輸出nums=[1,2,3] 返回?cái)?shù)組長(zhǎng)度為3

    (3)思路

    此題和第一題有點(diǎn)相似,具體思路看下圖

    (4)代碼

    int removeDuplicates(int* nums, int numsSize) {int front=0;int behind=0;if(numsSize==0)//特別注意空數(shù)組的情況,往往就是這一個(gè)測(cè)試用例無法通過{return 0;}else{for(behind=1;behind<numsSize;behind++){if(nums[front]!=nums[behind]){front++;nums[front]=nums[behind];}}return front+1;//注意這里要返回front+1,因?yàn)闇y(cè)試在輸出時(shí)在到front時(shí)會(huì)停止} }

    題目三

    (1)描述

    對(duì)于非負(fù)整數(shù) X 而言,X 的數(shù)組形式是每位數(shù)字按從左到右的順序形成的數(shù)組。例如,如果 X = 1231,那么其數(shù)組形式為 [1,2,3,1]。

    給定非負(fù)整數(shù) X 的數(shù)組形式 A,返回整數(shù) X+K 的數(shù)組形式。

    (2)示例

    (3)思路

    例如X=1200,其數(shù)組形式A=[1,2,0,0],若K為34,則X+K=1234,X+K的數(shù)組形式=[1,2,3,4]。
    所以從個(gè)位開始逐個(gè)相加,相加完一個(gè),放在數(shù)組中,由于是順序放的,所以最后還要逆置數(shù)組

    首先我們要求出數(shù)字K有幾位,以確定需要多大的數(shù)組

    int* addToArrayForm(int* A,int ASize,int K,int* returnSize) {int KSize=0;int KNum=k;while(KNum){++KSize;KNum/=10;} } int len=ASize>KSize?ASize:KSize; int* retarr=(int*)malloc(sizeof(int)*(len+1));//找出這兩個(gè)數(shù)組哪個(gè)大,新的數(shù)組最厲害也只能比它大一位

    接著就是要從個(gè)位開始逐個(gè)相加,相加時(shí)會(huì)涉及到進(jìn)位的問題

    int Ai=ASize-1;//找到數(shù)組A的最后一位 int reti=0;//reti用于控制相加后的下標(biāo) int nexnum=0;//用于控制進(jìn)位 while(len--)//比如說最大長(zhǎng)度為4為,那么他就要進(jìn)行4次運(yùn)算 {int a=0;if(Ai>=0)//如果是1200+34那都沒有問題,因?yàn)锳i不會(huì)越界,但是如果是34+1200,Ai就會(huì)成為負(fù)數(shù),所以此時(shí)對(duì)于34,如果Ai被檢測(cè)為負(fù)數(shù),說明到達(dá)了百位,那么它的百位和千位就都是0了.如果Ai是正數(shù),那么就把正常的值賦值給a{a=A[Ai];Ai--;}int ret=a+K%10+nextnum;K/=10;//比如K=1234,%10,取出個(gè)位4,%10相當(dāng)于取前三位進(jìn)入下次循環(huán),再取此時(shí)的個(gè)位3,以此類推if(ret>9){ret-=10;//比如個(gè)位是9+9=18,那么個(gè)位的數(shù)字就是18-10=8;nexnum=1;//置為1,下一位就會(huì)進(jìn)1}else{nexnum=0;}retarr[reti]=ret;++reti;//一次循環(huán)后,計(jì)算得到數(shù)字依次放到數(shù)組中 } if(nexnum==1) {retarr[reti]=1;++reti;//比如800+200=1000,相加時(shí),計(jì)算到8+2的時(shí)候,已經(jīng)算了三次,所以不會(huì)再進(jìn)入循環(huán),但是這一位沒有進(jìn)上去,所以對(duì)于這種情況要單獨(dú)處理 }

    最后,由于相加時(shí)放元素是從0,也就是按照順序放置的,所以最后的結(jié)果和實(shí)際結(jié)果是相反的,所以要進(jìn)行逆置

    int left=0,right=reti-1; while(left<right) {int temp=retarr[left];retarr[left]=retarr[right];retarr[right]=temp; }

    還有,返回值就是數(shù)組,一定注意形參的這個(gè)int* returnSize,它的意思就是要里面解引用修改數(shù)組的長(zhǎng)度,不然外面是無法輸出這個(gè)數(shù)組的,因?yàn)闆]有長(zhǎng)度

    *returnSize=reti;return retarr;

    總結(jié)

    以上是生活随笔為你收集整理的数组OJ题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。