九度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;

}

 


 

你可能感兴趣的:(Google)