数组OJ题
文章目錄
- 題目一
- (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)思路
采用雙指針法
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é)
- 上一篇: linux 多线程安全定时器
- 下一篇: 【团队项目】2.0