1.實現乙個函式,可以左旋字串中的k個字元。
aabcd左旋乙個字元得到abcda
aabcd左旋兩個字元得到bcdaa
首先還是把main()函式給出來
這裡取函式名為move_left
#include#include#include#includeint main()
方法一: 移位根據k的值,需要逆序2個字元----->cdefab1.將字串abcdef的第乙個字元儲存起來(這裡是a)-->
bcdef
2.將剩下的字串都向前移一位---->
bcdef
3.將剛才儲存的字元給字串最後乙個位置----->bcdef
a4.根據k值進行迴圈
**如下:
void move_left(char* arr, int k)
*(arr + len-1) = tmp;//每次迴圈都要將第乙個數放在最後乙個位置
}}
方法二:三步翻轉法構造這個函式的思路:根據k的值,需要逆序2個字元----->cdefab1.逆序整個字串得到------->fedcba
2.將字串前面len-k個字元翻轉一次---->cdefba
3.將字串後面剩下的字元逆序----->cdefab
**如下:
void reverse(char* left, char*right)
}void move_left(char* arr, int k)
個人覺得找個方法很值得大家學習,所以標題我也就用它了2.現乙個函式,可以右旋字串中的k個字元(方法同上) 例:
aabcd右旋乙個字元得到daabc
aabcd右旋兩個字元得到cdaab
同樣的道理,右旋 --如法炮製
直接給出**:
#include#include#include#includevoid reverse(char *left ,char* right)
}void move_right(char *arr, int k)
int main()
上面的方法都可以為下面的問題提供乙個便利的方法3.判斷乙個字串是否為另外乙個字串旋轉之後的字串。
例如:給定s1 = aabcd和s2 = bcdaa,返回1,給定s1=abcd和s2=acbd,返回0.
方法一:
按照三步翻轉法的思路;
我就直接給**,(這裡新增了主函式,便於大家理解)
#include#include#include#includevoid move_left(char* arr, int k) //左旋
*(arr + len - 1) = tmp;//每次迴圈都要將第乙個數放在最後乙個位置 }}
int main()
else
system("pause");
return 0;
}
方法二:看到這個題的時候,第乙個想法就是用三步翻轉法,但做完之後,又想到了乙個點子;想知道麼??來,下面看!
思路:
1.首先比較之前,這兩個字串大小總該是一樣的吧
2.翻轉後和另乙個字串比較(有沒有想到strcat這個函式呢),那就將試試strcat(s1,s1)------>
aabcd
aabcd
3.如果得到的字串若包含另乙個字串,那麼肯定 是
下面給出**:
#include#include#include#includeint is_move(char* arr, char* src)
strncat(arr,arr,len1); //注意(2)
if (strstr(arr, src))
else }
int main()
else
system("pause");
return 0;
注意:1.如果兩個字串長度都不一樣,那麼還有比較的意義麼2.如果用了strcat(),那麼作為這個函式的結束標誌\0哪去了?
看完了,記得點評哦
日常 演算法 旋轉字串 三步翻轉法
給定乙個字串,要求把字串前面的若干個字元移動到字串的尾部,如把字串 abcdef 前面的2個字元 a 和 b 移動到字串的尾部,使得原字串變成字串 cdefab 請寫乙個函式完成此功能,要求對長度為n的字串操作的時間複雜度為 o n 空間複雜度為 o 1 對於這個問題,換乙個角度思考一下。將乙個字串...
有意思的三國
三國 是很有意思的。雖然三國只不過是許多次朝代更替之一,時間也不很長,但是三國似乎很熟悉。董卓亂政 挾天子以令諸侯 赤壁之戰 生子當如孫仲謀 就連那些幾乎可以斷定不可能存在的事情,桃園結義 空城計,我們不僅耳熟 而且能詳 還有矛盾的三姓家奴 馬中赤兔人中呂布,經常被 崇拜的武聖人關羽 為什麼我們這麼...
執行緒的幾個有意思的方法
1.join 方法 字面意思就是 讓某個執行緒join 參加 加入 進來。即讓加入的那個執行緒執行,而當前正在執行的執行緒 呼叫的執行緒 阻塞,直到加入的執行緒執行完成。一句話 誰join進來就執行誰。沒有使用join時的情況 package threaddemo public class firs...