三、翻轉字串
1、題目要求
給定一顆二叉搜尋樹,請找出其中第k大的節點。例如:在下面這顆二叉搜尋樹中,按結點數值大小排序,第三大結點的值是4.
2、題目分析
根據二叉搜尋樹的特點,我們都知道中序遍歷的結果就是遞增的排序。所以我們只需要中序遍歷演算法遍歷一顆二叉搜尋樹,就可以找到他的第k大結點。具體**實現如下:
biarytreenode*
kthnodecore
(biarytreenode* proot,
unsigned
int k)
if(target ==
nullptr
&& target-
>leftchild !=
nullptr
) target =
kthnodecore
(proot-
>rightchild, k)
;return target;
}biarytreenode*
kthnode
(biarytreenode* proot,
unsigned
int k)
1、題目要求輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。
2、題目解析
方法一:
看到這題能想到的最直接的解法就是先在陣列中固定乙個數字,再依次判斷陣列中其餘的n-1個數字與它的和是不是等於s。但是這種演算法的時間複雜度是o(n^2)。不值得提倡使用
方法二:
既然上面這種方法不可行,那麼就要找到一種更優的演算法來解決。我們要抓住陣列有的特點。我們還是以具體的例子來加以分析,以陣列及期待的和15為例子。我們定義兩個指標,第乙個指標p1指向陣列的第乙個數字,第二個指標p2指向陣列的最後乙個數。然後計算兩個數的和sum。陣列指標指向如下圖所示:
然後做出相關調整,調整的規則是:如果兩個數的和sum大於s,則p2往前移動尋找較大數字前面的數字;如果兩個數的和sum小於s,則p1往後移動尋找較小數字後面的數字。這個例子具體的步驟,我們可以用以下的**來描述.他的時間複雜度是o(n)
有了上述的分析,我們就可以寫出**如下:
bool
findnumberwithsum
(int data,
int length,
int sum,
int* num1,
int* num2)
else
if(cursum > sum)
end--
;else
begin++;}
return found;
}
1、題目要求輸入乙個正整數s,列印出所有和為s的連續正數序列(至少含有兩個數)。例如,輸入15,由於1+2+3+4+5=4+5+6=7+8=15.。所以列印出3個連續序列1~5,4-6和7-8.
2、題目解析
這道題的思路和上一題類似,還是用兩個數來分別表示序列的最大值和最小值。不同的是這裡沒有乙個現成的陣列,所以我們把small初始化為1,big初始化為2。同樣的,比較序列和sum與s的大小,如果sum>s,則可以從序列中去掉較小的值。如果序列和sumvoid
(int samll,
int big)
printf
("\n");
}void
findcontinuoussequence
(int sum)
big++
; cursum +
= big;
}}1、題目要求
輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。為簡單起見,標點符號和普通字母一樣處理。例如輸入字串「i am a student」,則輸出「student. a am i」
2、題目分析
此題的求解我們應該分兩步進行,第一步就是翻轉句子中所有的字元,比如翻轉「i am a student」中所有的字元得到「.tneduts a ma i」。但是這樣的話我們可以清晰的看見這樣的翻轉不但把句子裡面的單詞翻轉了還把單詞裡面的字母順序也翻轉了。所以應該進行我們的第二步操作:翻轉每個單詞中字元的順序。
下面,我們先完成翻轉這一過程的核心**如下:
void
reverse
(char
* pbegin,
char
* pend)
}
接下來,我們用這個函式先翻轉整個句子,再翻轉句子中的每個單詞。**實現如下:
char
*reversesentence
(char
* pdata)
elseif(
*pend ==
' '||
*pend ==
'\0'
)//整個翻轉過程
else
}return pdata;
}
1、題目要求字串的左旋操作是把字串前面的若干個字元轉移到字串的尾部。請定義乙個函式實現字串左旋操作的功能。比如,輸入字串「abcdefg」和數字2,該函式將返回左旋轉兩位得到的結果「cdefgab」。
2、題目分析
在上乙個問題的解決方案中,我們似乎可以得到一些啟示。在前面這個問題中,如果我們輸入的字串之中只有兩個單詞,那麼翻轉這個句子中單詞的順序就可以。比較這兩個字串,我們可以看成把原始字串「hello world」的前面若干個字元轉移到後面。
以題目中所展示的例子來說,我們先把前面兩個字元分到第一部分,把後面的所有字元分到第二部分。先分別翻轉兩個部分,再翻轉整個字串。就是有三次呼叫reverse函式。
char
*leftrotatestring
(char
* pstr,
int n)
}return pstr;
}
演算法基礎練習題《劍指offer》二
替換空格 class solution i int newlength oldnumber replacenumber 2 插入後的長度 if newlength length 如果計算後的長度大於總長度就無法插入 return int poldlength oldnumber 注意不要減一,因為隱...
劍指Offer習題
1.二維陣列中的查詢 題目 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。bool find int target,vector array else re...
鞏固練習題1
unit1 一.普通使用者登陸 student 普通使用者,密碼student 二.開啟乙個bash 三。修改student的密碼,把密碼更新成 t3st1ngtlme 主機字母和數字 1.若使用者為普通使用者,直接跟passwd,若不是,passwd 使用者名稱,表示修改其他使用者密碼。2.超級使...