挑战面试编程:单词翻转、高斯公式、魔方矩阵、黑白球、3n+1
题一:
把一字符串如"I love you."变为"you. love I"。
分析:
这并不是一简单的字符串reverse的操作,在reverse的过程中要保持单词本身的字母顺序。这就要求我们找到单词中间的间隔,显然是空格,或者是标点。单词也并非只是字母,也有可能是数字。
于是我们总结:两个标点或空格之间的内容,我们把它当做一单词。细节还得看代码……
代码:
这是一段简易的代码:
<span style="font-size:18px;">
#include<iostream>
using namespace std;
char* reverseWords(const char *s,char *t)
{
assert(s&&t);
int slen=strlen(s);
int start,end,begin=0; //start指向一个单词的起始位置的前一个,end表示结束位置的后一位
start=end=slen-1;
while(start>=0 && !(isalpha(s[start]))) //从右向左,找第一个字母出现的位置
start--;
while(start>=0)
{
while(start>=0 && isalnum(s[start]))
start--;
//此时start的位置要么是空格,要么就是标点
memcpy(t+begin,s+start+1,end-start);
//以下的调整需画图理解
begin+=end-start;
end=start;
start--;
}
*(t+begin)='\0';
return t;
}
int main()
{
char *s="I love you.";
cout<<"原字符串"<<endl;
cout<<s<<endl;
//构建一新的字符串存储变换后的
char *t=new char[strlen(s)+1]; //多一个位置存放'\0'
reverseWords(s,t);
cout<<"翻转……"<<endl;
cout<<t<<endl;
delete []t;
return 0;
}</span></span>
运行实例: