3.長度為l的順序表,編寫乙個時間複雜度為o(n),空間複雜度為o(1)的演算法,該演算法刪除線性表中所有值為x的元素。一看就是典型的雙指標問題,於是我寫**如下
for(i=0,j=i+1
;jif(a[j]==x)
else
if(a[i]==x) a[i]=a[j];
}//這部分**是有問題的,如果出現在第一位的話就無法解決了
return i+1
;//正確的方法
int k=0
;for(int i=0
;iif(a[i]!=x) a[k++]=a[i];
}//同時,利用找x然後刪除的辦法也是可解的
int k=0
;while(iif(a[i]==x) k++;
//注意這裡,記錄之前遇到的相等的數量k
//遇到不等的時候,向後賦值
else
a[i-k]=a[i];
i++;
}
題目問的是刪除值為x的,我們一般會考慮找x,然後把這些值跳過。
而比較好的辦法是利用雙指標,然後找不是x的,留下&賦值
8.給定陣列a[m+n],要求在不申請額外陣列空間的情況下,反轉前m和後n個數,並且其內部順序不可改變.顯然,限制了不申請額外空間就有點棘手了。
可以考慮先將整個陣列反轉,再將前n個,後m個分別反轉
void reverse(vector
nums,int left,int right){
if(left>=right || right>nums.size()) return;
int mid=(left+right)/2;
int offset=mid-left;
for(int i=0;i//於是反轉3次即可
reverse(nums,0,m+n+1);
reverse(nums,0,n-1);
reverse(nums,n,m+n-1);
故不要眼高手低地看待任何一題,真正把**寫出來,就會發現自己所寫的還有很多缺陷,都一定有可以改進的地方。 王道資料結構課後習題 P37
3 設l為帶頭節點的單鏈表,編寫演算法實現從尾到頭反向輸出每個節點的值。我想到的是reverse一下 笑哭 想想這個就有點殺雞用牛刀的感覺 看了題解說是可以用遞迴 臥槽瞬間orz class solution 利用reverse將整個鍊錶倒置 void reverseoutput listnode ...
王道資料結構線性表課後習題
1.1.從順序表中刪除具有最小值的元素 假設唯一 並由函式返回被刪除的元素的值,空出的位置由最後乙個元素填補,若順序表為空則顯示出錯資訊並退出執行 bool del min sqlist l,elemtype value l.data pos l.data l.length 1 空出的位置由最後乙個...
王道資料結構課後題 P121
7 判斷乙個二叉樹是否為完全 二叉樹。一開始是想著利用遞迴,判斷有左孩子而無右孩子的節點的個數,並且要求左孩子為葉子節點。判斷的條件很複雜,最後發現這種方法實際上是有問題的。如果同時碰到兩個節點同時為有左葉子節點而右子樹為空,這種情況按照判斷應當返回false 但是這種方法並不能正確返回 1 2 3...