《演算法之美》 字串相關問題 壹

2021-08-25 10:28:50 字數 1713 閱讀 8009

題目:編寫乙個單詞逆序輸出的演算法,例如輸入「see you in another life」,要求輸出「life another

in you see」。

解答:解法一:只需掃瞄一遍:

#include

void

reverseword(

const

char

* src,

char

* dest)

while

(count--);

break;

} if(*src ==

' ')

//遇到空格

*dest++ =

' ';

count = 0; }

else

} *dest =

'/0';

} intmain()

解法二:掃瞄兩遍。即簡單地將所有字元反轉,遍歷字串,將第乙個字元和最後乙個字元交換,第二個和倒數第二個交換,依次迴圈。接著進行第二次遍歷,對每個單詞反轉一次,這樣每個單詞就恢復成原有順序,得到題目要求的功能了:

#include

char

* reverseword(

const

char

* str)

intk = 0;

while

(k < len)

//第二次掃瞄,將每個單詞反轉

k = j+1;

//為跳過空格,為下一輪迴圈做準備

j--;

//回退一步,去掉空格

for(;i

} return

restr; }

intmain()

題目:給定乙個字串,乙個這個字串的子串,將第乙個字串反轉,但保留子串的順序不變。例如:

輸入:第乙個字串:「see you in another life」

子串:「in」

輸出:「efil rehtona in uoy ees」

解答:一般的方法是先掃瞄一遍第乙個字串,用stack把它反轉,同時記錄下子串出現的位置;然後再掃瞄一遍反轉後的字串,掃瞄過程中將原來子串再反轉,其他的不變,這樣就得到答案了。

那麼只掃瞄一遍怎麼辦呢?只需在掃瞄的過程中將子串反序壓入堆疊;掃瞄完之後,將堆疊中字元彈出,這樣子串就還是原來的順序了。實現**如下:

#include

#include

#include

const

char

* reverse(

const

char

* s1,

const

char

* token)

if(*ptoken ==

'/0'

) //包含字串token

ptoken = token;

rear = head; }

else

//不是分割的字串

} char

* ret =

newchar

[strlen(s1)+1];

inti = 0;

while

(!stackone.empty())

//非空

ret[i] =

'/0';

return

ret; }

intmain()

完美字串

約翰認為字串的完美度等於它裡面所有字母的完美度之和。每個字母的完美度可以由你來分配,不同字母的完美度不同,分別對應乙個1 26之間的整數。約翰不在乎字母大小寫。也就是說字母f和f 的完美度相同。給定乙個字串,輸出它的最大可能的完美度。例如 dad,你可以將26分配給d,25分配給a,這樣整個字串完美...

完美字串

約翰認為字串的完美度等於它裡面所有字母的完美度之和。每個字母的完美度可以由你來分配,不同字母的完美度不同,分別對應乙個1 26之間的整數。約翰不在乎字母大小寫 也就是說字母a和a的完美度相同 給定乙個字串,輸出它的最大可能的完美度。例如 dad,你可以將26分配給d,25分配給a,這樣整個字串完美度...

完美字串

完美字串 約翰認為字串的完美度等於它裡面所有字母的完美度之和。每個字母的完美度可以由你來分配,不同字母的完美度不同,分別對應乙個1 26之間的整數。約翰不在乎字母大小寫 也就是說字母a和a的完美度相同 給定乙個字串,輸出它的最大可能的完美度。例如 dad,你可以將26分配給d,25分配給a,這樣整個...