這道題我“第一次抱着試試看的態度”就叫上去了,結果直接AC。貼着道題主要是給了我一些經驗,首先看到一道題想到的就是這道題有沒有陷阱,比如內存過大,或者數據溢出等等,或者很噁心的最前面和最後面會不會是特殊情況(這道題就是),還有是否當輸入0.1.2的時候按着自己的思路來的話會是和答案不一樣的結果?
字符串擴展
Time Limit: 1000MS Memory limit: 65536K
題目描述
Tom有些時候爲了記錄的方便,常常將一些連續的字符用擴展符'-'簡單表示。比如abcdefg可以簡寫爲a-g,即用起始的字符和終止字符中間加上一個擴展符'-'來表示這個字符串。但是爲了處理的方便,Tom又必須將這些我們簡單記法擴展成原來的字符串。很明顯要是人工來做的話必定很麻煩,Tom知道計算機可以幫助他完成這個任務,但是他卻不會編程,這的確讓他很上火。他知道今天是山東理工大學第三屆ACM校賽的日子,屆時來自全校的編程愛好者都會來參加比賽,他很興奮,因爲這個困惑他良久的問題終於要被解決了。給你一個含有擴展符'-'的字符串,你的任務就是將他還原成原來的字符串。要求是隻處理[a-z]、[A-Z]、[0-9]範圍內的字符擴展,即只有當擴展符前後的字符同時是小寫字母、大寫字母或數字時並且擴展符前面的字符不大於後面的字符才進行擴展,其它情況不進行擴展,原樣輸出。例如:a-R、D-e、0-b、4-B等字符串都不進行擴展。
輸入
第一行是一個正整數T,表示共有T組測試數據(T < 100)。下面的T行,每一行包括一個長度不大於1000的待擴展字符串.
輸出
每組測試數據輸出一行擴展後的字符串。
示例輸入
3 ADEa-g-m02 acm-0-5-a-ac-cm-m-A-AC-CM-M Welcometothe3rdACM/ICPCCampusProgrammingContestofSDUT-1-3-A-z-a-Z
示例輸出
ADEabcdefghijklm02 acm-012345-aaccmm-AACCMM Welcometothe3rdACM/ICPCCampusProgrammingContestofSDUT-123-A-z-a-Z
- #include<stdio.h>
- #include<string.h>
- void main()
- {
- char s[1001];
- int i,j,p,t,n;scanf("%d%*c",&n);
- while(n--)
- {
- gets(s);
- for(i=0;s[i] != '\0'; i++)
- {
- if(i == 0||s[i+1] == '\0')
- {
- printf("%c",s[i]);
- }
- else
- {
- t = i-1;p = i+1;
- if(s[i] == '-')
- {
- if(s[t] >= '0' && s[t]<='9' && s[p] >= '0' && s[p]<='9')
- {
- if(s[t] < s[p])
- {
- while(s[t]<s[p]-1)
- {
- s[t]++;
- printf("%c",s[t]);
- }
- }
- else if(s[t] > s[p])
- printf("%c",s[i]);
- }
- else if(s[t] >= 'a' && s[t]<'=z' && s[p] >= 'a' && s[p]<='z')
- {
- if(s[t] < s[p])
- {
- while(s[t]<s[p]-1)
- {
- s[t]++;
- printf("%c",s[t]);
- }
- }
- else if(s[t] > s[p])
- printf("%c",s[i]);
- }
- else if(s[t] >= 'A' && s[t]<='Z' && s[p] >= 'A' && s[p]<='Z')
- {
- if(s[t] < s[p])
- {
- while(s[t]<s[p]-1)
- {
- s[t]++;
- printf("%c",s[t]);
- }
- }
- else if(s[t] > s[p])
- printf("%c",s[i]);
- }
- else printf("%c",s[i]);
- }
- else
- printf("%c",s[i]);
- }
- }
- printf("\n");
- }
- }