牛客网-倒置字符串
时间限制:1秒 空间限制:32768K 热度指数:16856
题目描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
示例1
输入
I like beijing.
输出
beijing. like I
两个关键问题:
1. 字符串读入
char str[100];
int size = 0;
// str[size-1] is '\n'
while((str[size++] = getchar()) != '\n');
2. 单词状态标记
int begin, end;
bool unstart = true;
for(int i=0; i<size; ++i){
if(' ' == str[i] || '\n' == str[i]){
// 如果正在组建单词,str[begin, end]是一个单词
unstart = true;
}else{
end++;
if(unstart) {
begin = end = i;
unstart = false;
}
}
}
单词开始的情况:
1) 当前字符为字母,没有前一个字符
2) 当前字符为字母, 前一个字符为空格
单词结束的标记:
1)当前字符为‘ ’或‘\n’;单词处于创建状态
解题思路:
a. reverse the whole string
b. reverse each word (include ‘,’ ‘.’ ‘!’ ) in the string
int begin=0, end=size-2;
reverse(in, begin, end);
bool building = false;
for(int i=0; i<size; i++){
if(in[i] == ' ' || in[i] == '\n'){
if(building) reverse(in, begin, end);
building = false;
}else {
end++;
if(!building) {
begin = end = i;
building = true;
}
}
}
cout << in;