[58]翻转字符串
1.翻转单词顺序
1.1题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点和普通字母一样处理
输入
“I am a student.”
输出
“student. a am I”
1.2思路
- 翻转句子中所有的字符
- 翻转每个单词中字符的顺序
1.3代码
1.3.1.C
void Reverse(char* pBegin, char* pEnd)
{
if(pBegin==NULL || pEnd==NULL) return ;
while(pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin++;
pEnd--;
}
}
char* reverseWords(char* s)
{
if(s == NULL) return NULL;
char *pBegin = s;
char *pEnd = s;
while(*pEnd != '\0') pEnd++;
pEnd--; //找到结尾
Reverse(pBegin, pEnd);
//翻转每一个单词
pBegin = pEnd = s;
while(*pBegin != '\0')
{
if(*pBegin == ' ') //去掉空格
{
pBegin++;
pEnd++;
}
else if(*pEnd == ' ' || *pEnd =='\0')
{
Reverse(pBegin, --pEnd);
pBegin = ++pEnd; // 指向下一个字符
}
else
{
pEnd++;
}
}
return s;
}
1.3.2.C++
// 两种实现翻转的方式
for(int i=0,j=s.size()-1;i<j;i++,j--) swap(s[i],s[j]);
reverse(s.begin(), s.end()); // 先整体翻转
class Solution {
public:
string reverseWords(string s)
{
for(int i=0,j=s.size()-1;i<j;i++,j--) swap(s[i],s[j]);
//reverse(s.begin(), s.end()); // 先整体翻转
for(int i=0;i<s.size();i++)
{
int j=i;
while(j<s.size() && s[j] != ' ') j++;
reverse(s.begin()+i,s.begin()+j);
i=j;
}
return s;
}
};
2.左旋转字符串
2.1题目
字符串的左旋转操作是把字符串前面的若干个字符串转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能
输入字符串
abcdefg
和数字 2该函数返回左旋转两位得到的结果
cdefgab
2.2思路
暴力解法
- 移动第一位,然后把后面字符移动到前面
- 调用函数移动多位
2.3代码
class Solution {
public:
string leftRotateString(string str, int n)
{
while(n--)
LeftOne(str);
return str;
}
void LeftOne(string &str)
{
char a=str[0];
for(int i=1;i<str.size();i++)
str[i-1] = str[i];
str[str.size()-1] = a;
}
};