1. 旋轉(zhuǎn)字符串
給定一個字符串腰奋,要求把字符串前面的若干個字符移動到字符串的尾部,如把字符串“abcdef”前面的2個字符'a'和'b'移動到字符串的尾部每界,使得原字符串變成字符串“cdefab”逗堵。請寫一個函數(shù)完成此功能,要求對長度為n的字符串操作的時間復(fù)雜度為 O(n)终畅,空間復(fù)雜度為 O(1)。
解法:
兩部分單獨(dú)反轉(zhuǎn)竟闪,再整體反轉(zhuǎn)
2. 單詞翻轉(zhuǎn)
輸入一個英文句子,翻轉(zhuǎn)句子中單詞的順序杖狼,但單詞內(nèi)字符的順序不變炼蛤,句子中單詞以空格符隔開。為簡單起見蝶涩,標(biāo)點(diǎn)符號和普通字母一樣處理理朋。例如,輸入“I am a student.”绿聘,則輸出“student. a am I”嗽上。
解法:
和上面做法一樣,每部分單獨(dú)反轉(zhuǎn)熄攘,再整體反轉(zhuǎn)
3. 鏈表翻轉(zhuǎn)
給出一個鏈表和一個數(shù)k兽愤,比如,鏈表為1→2→3→4→5→6挪圾,k=2浅萧,則翻轉(zhuǎn)后2→1→6→5→4→3,若k=3哲思,翻轉(zhuǎn)后3→2→1→6→5→4洼畅,若k=4,翻轉(zhuǎn)后4→3→2→1→6→5棚赔,用程序?qū)崿F(xiàn)帝簇。
解法:
相當(dāng)于用【棧】結(jié)構(gòu)靠益,讓鏈表反轉(zhuǎn)
private TwoNodes reversePartOfList( Node node, int k ){
if( node == null || node.next == null ){
return null;
}
TwoNodes res = new TwoNodes();
int count = 1;
Node nextHead = node.next;
node.next = null; //把第一個放到棧底丧肴,沒有next
Node temp = null;
while( nextHead != null && count < k ){
temp = node; //記住棧頭
node = nextHead; //把新的一個放到棧底
nextHead = nextHead.next; //接著處理下一個
node.next = temp;
count++;
}
res.node1 = node;
res.node2 = nextHead;
return res;
}