一、題目描述
牛客最近來了一個新員工Fish,每天早晨總是會拿着一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
二、分析
1.先寫一個反轉函數,功能是可以反轉所有傳入的字符串
2.整體反轉整個字符串,此時就需要將每個單詞的字母順序翻轉,所以遍歷此時的字符串
3.遇到空格就記錄一個單詞的起始位置或截止位置,然後將單詞傳入反轉函數,時期
引用傳參、swap函數:
class Solution {
public:
void reverseworld(string &str,int i,int j)
{//i和j分別是翻轉部分字符串的起止位置
while(i < j)
{
swap(str[i++],str[j--]);
}
}
string ReverseSentence(string str) {
int len = str.size();
reverseworld(str,0,len-1);
int i = 0;//i是單詞開始位置
int j = 0;//j是單詞終止爲止
int k = 0;//用來做遍歷字符串的變量
while(k < len)
{
while(k<len && str[k] == ' ' )//記錄空格的位置
{
k++;
}
i = k;//記錄開始位置,str[i]是空格
while( k<len && str[k] != ' ')
{
k++;
}
j = k;//str[j]此時是空格,所以再反轉的時候,應該截止到它前一個翻轉
reverseworld(str,i,j-1);
}
return str;
}
};
指針傳參、利用指針的交換函數:
左旋轉字符串題目描述
彙編語言中有一種移位指令叫做循環左移(ROL),現在有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
分析:
方法一:
class Solution {
public:
string LeftRotateString(string str, int n) {
string s;
int j = 0;
for(int i=n ;i<str.length();i++)
{
s[j]=str[i];
j++;
}
for(int i = 0; i<=n-1; i++)
{
s[j] = str[i];
j++;
}
return s;
}
};