一、翻转字符串
题目要求:输入一个英文句子,翻转句子中的单词顺序,但是单词内部的顺序并没有改变。(其中,标点符号也和普通字母一起处理),例如:"I like travelling!",输出为“travelling! like I!”
解题思路:这个题比较简单,思路大致分为两步。
1.翻转整个字符串的顺序,结果是“!gnillevart ekil I”;
2.翻转由第一步得到的整个字符串中的每一个单词,结果就是“travelling! like I!”了。
代码实现如下:
void Reverse(char* pStart, char* pEnd)
{
if (pStart == NULL&&pEnd == NULL)
return;
while (pStart <= pEnd)
{
char tmp = *pStart;
*pStart = *pEnd;
*pEnd = tmp;
pStart++;
pEnd--;
}
}
char* ReverseWords(char* pData)
{
//判空
if (pData == NULL)
return NULL;
//翻转整个字符串
char* pStart = pData;
char* pEnd = pData;
while (*pEnd != '\0')
{
pEnd++;
}
pEnd--;
Reverse(pStart, pEnd);
//翻转每一个单词
pStart = pEnd = pData;
while (*pStart != '\0')
{
if (*pStart == ' ')
{
pStart++;
pEnd++;
}
else if (*pEnd == ' ' || *pEnd == '\0')
{
Reverse(pStart, --pEnd);
pStart = ++pEnd;
}
else
{
pEnd++;
}
}
return pData;
}
二、左旋字符串
题目描述:将字符串前面的若干个字符转移到该字符串的尾部,例如,将字符串“abcdefg”和数字2,意思是实现左旋两位得到的结果为“cdefgab”
解题思路:我们不难发现上面的题这个题有共同之处,都是旋转字符串,但这个题多规定了一步,就是对于指定位置的旋转,类比上题,我们将这个题的思路分为三步
1.翻转字符串前面n个字符,得到的结果是:“bacdefg”;
2.翻转字符串后面部分的字符,得到的结果是:“bagfedc”;
3.翻转上述步骤一和步骤二的到的整个字符串,得到的结果是:“cdefgab”。
代码实现如下:
void Reverse(char* pStart, char* pEnd)
{
if (pStart == NULL&&pEnd == NULL)
return;
while (pStart <= pEnd)
{
char tmp = *pStart;
*pStart = *pEnd;
*pEnd = tmp;
pStart++;
pEnd--;
}
}
char* LeftRotateString(char* pStr, int n)
{
if (pStr == NULL || n <= 0)
return NULL;
while (!pStr)
{
int nLength = static_cast<int> (strlen(pStr));
if (nLength > 0 && n > 0 && n < nLength)
{
char* pFirstBegin = pStr;
char* pFirstEnd = pStr + n - 1;
char* pTwoBegin = pStr + n;
char* pTwoEnd = pStr + nLength - 1;
//步骤1
Reverse(pFirstBegin, pFirstEnd);
//步骤2
Reverse(pTwoBegin, pTwoEnd);
//步骤3
Reverse(pFirstBegin, pTwoEnd);
}
}
return pStr;
}
另外一种接口的实现方式:
void Reverse(string& str, int pBegin, int pEnd)
{
if (str.empty())
return;
while (str[pBegin] < str[pEnd])
{
char tmp = str[pBegin];
str[pBegin] = str[pEnd];
str[pEnd] = tmp;
str[pBegin]++;
str[pEnd]--;
}
}
string LeftRotateString(string str, int n)
{
if (str.empty() || n <= 0)
return NULL;
while (!str.empty())
{
int nLength = str.size();
if (n > 0 && nLength > 0 && n < nLength)
{
int FirstBegin = 0;
int FristEnd = n - 1;
int SencondBegin = n;
int SencondEnd = nLength - 1;
Reverse(str, FirstBegin, FristEnd);
Reverse(str, SencondBegin, SencondEnd);
Reverse(str, FirstBegin, SencondEnd);
}
}
return str;
}