58-01 翻转单词顺序
题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。
C 语言题解
第一步翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。
第二步再翻转每个单词中字符的顺序,就得到了"student.a am I"。
char* reverseWords(char *pData)
{
// 检查输入的合法性
if (pData == NULL)
return NULL;
char *pBegin = pData;
char *pEnd = pData;
while (*pEnd != '\0')
pEnd++;
// 此处需要注意,因为末尾处在'\0',所以需要向前一个位置
pEnd--;
// 首先翻转整个句子
Reverse(pBegin, pEnd);
// 遍历整个字符串,翻转句子中的每个单词
pBegin = pEnd = pData;
while (*pBegin != '\0')
{
// 前指针遇到空格,两个指针同时前进
if (*pBegin == ' ')
{
pBegin++;
pEnd++;
}
// 后指针遇到空格或者字符串结尾标志,意味着要进行一次翻转
else if (*pEnd == ' ' || *pEnd == '\0')
{
// 反转空格或者字符末尾标志位之前的单词
Reverse(pBegin, --pEnd);
// 同时到空格
pBegin = ++pEnd;
}
else
// 后指针前进
pEnd++;
}
return pData;
}
// 定义一个反转字符串的函数
void Reverse(char *pBegin, char *pEnd)
{
if (pBegin == NULL || pEnd == NULL)
return;
// 遍历字符串收尾直接交换,直到达到中间位置
while (pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin++, pEnd--;
}
}
C++ 题解
解题思路与C语言题解的思路一致。
class Solution {
public:
string ReverseSentence(string str)
{
char * pData = (char*)str.c_str();
if (pData == NULL)
return NULL;
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);
pEnd++;
pBegin = pEnd;
}
else
{
pEnd++;
}
}
return pData;
}
void Reverse(char *pBegin, char *pEnd)
{
if (pBegin == NULL || pEnd == NULL)
return;
// 遍历字符串收尾直接交换,直到达到中间位置
while (pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
pBegin++, pEnd--;
}
}
};
注意:
- 这里涉及C++的
string
类型与C语言的char*
之间的转换,具体参考string、char *的转换
python题解
方法一
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
temp=s.split()
if len(temp)==0:
return s
return ' '.join(s.split()[::-1])
注意:
- 采用list[::-1]可以反转这个列表。
方法二
安装两步翻转的思想。
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
# 检查输入的合法性
if s==None or len(s)<=0:
return ''
# 将字符串转换成列表
s=list(s)
# 反转字符串
s=self.Reverse(s)
pStart=0
pEnd=0
listTemp=[]
result=''
#print(s)
while pEnd<len(s):
# 如果是最后一个字符
if pEnd==len(s)-1:
#print(self.Reverse(s[pStart:]))
listTemp.append(self.Reverse(s[pStart:]))
break
if s[pStart]==' ':
pStart +=1
pEnd +=1
listTemp.append(' ')
elif s[pEnd]==' ':
#print(self.Reverse(s[pStart:pEnd]))
listTemp.append(self.Reverse(s[pStart:pEnd]))
pStart=pEnd
else:
pEnd +=1
# 列表重新转换成字符串
for i in listTemp:
result+=''.join(i)
return result
def Reverse(self,s):
# s是一个list列表
start=0
end=len(s)-1
while(start<end):
s[start],s[end]=s[end],s[start]
start+=1
end-=1
return s
注意:
- python中实现两个值互换的方法。
- 需要在字符串和列表之间相互转换。