[牛客网] 倒置字符串

牛客网-倒置字符串


时间限制: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;

猜你喜欢

转载自blog.csdn.net/cp_oldy/article/details/88286000