每日演算法題三道之字串迴圈移動以及詞語的翻轉

2021-08-16 10:11:48 字數 1396 閱讀 1120

題目:

2、給定乙個字串s[0…..n-1],要求把s的前k個字元移動到s的尾部,如把字串」abcdef」前面的2個字元』a』,『b』移動到字串的尾部,得到新字串」cdefab」:即字串迴圈左移k。要求時間複雜度為o(n),空間複雜度為o(1)。

1)思路一:逐個字元左移,將bcdef依次左移1個,再將a移到末尾;b是同樣的操作,這樣最壞時間複雜度為o(n2)。

2)思路二:先將ab,cdef分別儲存,再將ab拼接到cdef末尾,空間複雜度為o(n)。

3)思路三:

三次翻** 令」ab」 = x,」cdef」 = y;

①x翻轉 -> x的逆序x』

②y翻轉 -> y的逆序y』

③x』y』翻轉 -> yx

類似的題目

i love u –> u love i

i翻轉,love翻轉,u翻轉 ,最後整個翻轉

**:

/************************************

功能:翻轉一句話中的詞語,eg: i love u -> u love i@athor:rly@date: 2018-3-8

*************************************/

#include #include using namespace std;

void swap(char &c1, char &c2)

void reversestr(string &str, int start, int end)

}string rotatestrofword(const string srcstr)

string srcstr = srcstr;

int start = 0;

int end = 0; //記錄字串中word在字串中的起始位置和終止位置

for (start = 0; start < srcstr.size();)

} //當遇到空格時,說明已找到乙個完整的詞

if ((end - start) > 1)

//當這個詞個數大於1時才翻轉

if (end == srcstr.size())

//若找到了尾部,則結束

while (srcstr[end] == ' ')

//繼續找下乙個詞

start = end;

}reversestr(srcstr, 0, srcstr.size() - 1); //最後整句翻轉

return srcstr;

}

每天一道演算法題之字串相加

題目描述 給定兩個字串形式的非負整數 num1 和num2 計算它們的和。注意 num1 和num2 的長度都小於 5100.num1 和num2 都只包含數字 0 9.num1 和num2 都不包含任何前導零。你不能使用任何內建 biginteger 庫,也不能直接將輸入的字串轉換為整數形式。1 ...

每日演算法 重構字串

給定乙個字串s,檢查是否能重新排布其中的字母,使得兩相鄰的字元不同。若可行,輸出任意可行的結果。若不可行,返回空字串。示例 1 輸入 s aab 輸出 aba 示例 2 輸入 s aaab 輸出 注意 s 只包含小寫字母並且長度在 1,500 區間內。前面返回空的判斷就不加以贅述了,直接說後面的解法...

每天一道演算法題 迴圈移動

華為oj上的題,始終有乙個test沒過,不知道為什麼 也考慮移動次數為負值,大於10,0,10這些邊界情況了。只是一直沒有移動陣列,因為只是需要輸出嘛。include using namespace std intmain int step 0 cin step 向前移動,先輸出後m個和,再輸出前m...