九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目

题目地址:http://ac.jobdu.com/problem.php?pid=1525

 

题目描述:

小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串的每个子串都打印反了,现在麻烦你帮小明将这些字符串中的子串修正过来,同时为了使卡片美观,压缩其中的连续空格为1个。

输入:

输入包含多个测试用例,每个测试用例的第一行是一个正整数 n,1=<n<=100000,代表卡片上字符串的长度。第二行输入长度为n的字符串(字符串仅包含小写字母和空格)。当n为0时,代表输入结束。

输出:

对应每个测试用例,请按照要求输出修正过的字符串。

样例输入:
3
abc
13
abc   efg hij
样例输出:
cba
cba gfe jih
来源:
2012年Google校园招聘笔试题目
#include <stdio.h>
 
#define MAX 100001
 
int Delete_Blank (char str[], int n){
    int i, j;
    int flag;
    int cnt;
 
    cnt = 0;
    i=0;
    j=0;
    while (i < n){
        str[j] = str[i];
        if (str[i] == ' '){
            while (str[++i] == ' ')
                continue;
            ++j;
            str[j] = str[i];
        }
        else{
            ++i;
            ++j;
        }
    }
    str[j] = '\0';
    return j;
}
 
void Reverse (char str[], int start, int end){
    char tmp;
    while (start < end){
        tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;
        ++start;
        --end;
    }
}
 
int main(void){
    char str[MAX];
    int n;
    int i;
    int start, end;
 
    while (scanf ("%d", &n) != EOF){
        while (getchar () != '\n')
            continue;
        gets (str);
        n = Delete_Blank (str, n);
        for (i=0; i<n; ++i){
            if (str[i] != ' '){
                start = i;
                while (++i < n && str[i] != ' ')
                    continue;
                end = i - 1;
                Reverse (str, start, end);
            }
        }
        puts (str);
    }
 
    return 0;
}

 


 

posted @ 2014-02-15 11:30  liushaobo  阅读(151)  评论(0编辑  收藏  举报