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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数组OJ题

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数组OJ题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

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

題目一

(1)描述

給你一個數組 nums 和一個值 val,你需要原地移除所有數值等于 val 的元素,并返回移除后數組的新長度。

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

(2)示例

輸入nums=[3,2,2,3],val=3 輸出nums=[2,2],數組長度位2

(3)思路

采用雙指針法

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

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

    此時來到“2”這個元素,發現其值不是val,那么就要將其放入0-slow區間中,也即此時要把fast所指元素賦值給slow

    賦值完成后,slow指針就要向后移動一下
    4. 重復上述步驟

    (4)代碼實現

    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)描述

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

    (2)實例

    輸入nums=[1,1,1,2,2,2,3] 輸出nums=[1,2,3] 返回數組長度為3

    (3)思路

    此題和第一題有點相似,具體思路看下圖

    (4)代碼

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

    題目三

    (1)描述

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

    給定非負整數 X 的數組形式 A,返回整數 X+K 的數組形式。

    (2)示例

    (3)思路

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

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

    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));//找出這兩個數組哪個大,新的數組最厲害也只能比它大一位

    接著就是要從個位開始逐個相加,相加時會涉及到進位的問題

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

    最后,由于相加時放元素是從0,也就是按照順序放置的,所以最后的結果和實際結果是相反的,所以要進行逆置

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

    還有,返回值就是數組,一定注意形參的這個int* returnSize,它的意思就是要里面解引用修改數組的長度,不然外面是無法輸出這個數組的,因為沒有長度

    *returnSize=reti;return retarr;

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。