剑指offer58. 翻转字符串 P284
- 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
(1) 可以用string一个从前一个从后+
(2) 用栈存string
(3) 书上的方法,先反转整个数组,然后反转每个单词。
char* ReverseSentence(char *pData)
{
if(pData == nullptr)
return nullptr;
char *pBegin = pData;
char *pEnd = pData;
while(*pEnd != '\0') // 找输入字符串的结尾
pEnd ++;
pEnd--;
// 翻转整个句子
Reverse(pBegin, pEnd);
// 翻转句子中的每个单词
pBegin = pEnd = pData;
while(*pBegin != '\0')
{
if(*pBegin == ' ') // 跳过空格
{
pBegin ++;
pEnd ++;
}
else if(*pEnd == ' ' || *pEnd == '\0') // 句子中间遇到空格,或者遍历结束
{
Reverse(pBegin, --pEnd); // 反转begin和end之间的单词
pBegin = ++pEnd;
}
else
pEnd ++; // begin和end之间还不是一个单词
}
return pData;
}
void Reverse(char *pBegin, char *pEnd) // 反转数组
{
if(pBegin == nullptr || pEnd == nullptr)
return;
while(pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin ++, pEnd --;
}
}
面试题58(二): 左旋转字符串 P286
题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。
方法1:书上方法
char* LeftRotateString(char* pStr, int n)
{
if(pStr != nullptr)
{
int nLength = static_cast<int>(strlen(pStr));
if(nLength > 0 && n > 0 && n < nLength)
{
char* pFirstStart = pStr;
char* pFirstEnd = pStr + n - 1;
char* pSecondStart = pStr + n;
char* pSecondEnd = pStr + nLength - 1;
// 翻转字符串的前面n个字符
Reverse(pFirstStart, pFirstEnd);
// 翻转字符串的后面len-n个字符
Reverse(pSecondStart, pSecondEnd);
// 翻转整个字符串
Reverse(pFirstStart, pSecondEnd);
}
}
return pStr;
}
方法2: string 分割之后+
char *LeftRotateString(char *in, int k) {
if (in == NULL) return NULL;
int len = 0;
char *p = in;
while((*p) != '\0') {
++p;
++len;
}
if (k == 0 || k >= len) return in;
string strfront = "";
string strback = "";
for (int i = 0; i < k; ++i) {
strfront += in[i];
}
for (int i = k; i < len; ++i) {
strback += in[i];
}
char ans[len]; // 这里不能用char *ans ,, 原因见下面(string和char*转换问题)
strcpy(ans, (strback + strfront ).c_str());
return ans;
}
char* c;
string s=“1234”;
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理
应该这样用:
char c[20];
string s=“1234”;
strcpy(c,s.c_str());
返回 c