数组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)思路
采用雙指針法
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;總結
- 上一篇: linux 多线程安全定时器
- 下一篇: 【团队项目】2.0