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