第二篇链接:字符串类习题、面试题详解(第二篇)
1题:WERTYU(竞赛基础题)
把手放在键盘上时,稍不注意就会往右错一位,这样的话Q会变为W,J会变为K等。输入一个错位后敲出的字符串,输出打字员本来想打出的句子。
样例输入:O S, GOMR YPFSU/
样例输出:I AM FINE TODAY.
1 #include <stdio.h> 2 const char *str = "`1234567890-=QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./"; 3 4 int main(void) 5 { 6 char c; 7 int i; 8 while ((c = getchar()) != EOF) 9 { 10 for (i = 0; str[i] && str[i] != c; i++); 11 if (str[i]) 12 putchar(str[i - 1]); 13 else 14 putchar(c); 15 } 16 17 return 0; 18 }
解析:本题注意两点:(1)for循环终止条件的判断,常量字符串末尾自动补“ ”,因而可利用str[i]的取值判断是否查找到最后一个字符。(2)反斜线“”是特殊字符,需要使用转义序列或直接引用其ASCII码。
2题:TeX括号(竞赛基础题)
在TeX中,左双引号是``,右双引号是’’。输入一篇包含双引号的文章,你的任务是把它转换成TeX格式。
样例输入:
“To be or not to be,” quoth the Bard, “thatis the question”.
样例输出:
``To be or not to be,” quoth the Bard,``that is the question”.
1 #include <stdio.h> 2 3 int main(void) 4 { 5 char c; 6 int q = 1; 7 while ((c = getchar()) != EOF) 8 { 9 if (c == '"') 10 { 11 printf("%s", q ? "``" : "''"); 12 q = !q; 13 } 14 else 15 printf("%c", c); 16 } 17 18 return 0; 19 }
解析:本题的关键是如何判断一个双引号是左双引号还是右双引号。
3题:周期串(竞赛基础题)
如果一个字符串可以由某个长度为k的字符串重复多次得到,我们说该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。
样例输入:HoHoHo
样例输出:2
写法1:
1 #include <stdio.h> 2 #include <string.h> 3 #define MAXLEN 80 4 int main(void) 5 { 6 char str[MAXLEN + 1] = {0}; 7 scanf("%s", str); 8 int len = strlen(str); 9 int result = len; 10 int i, j; 11 12 for (i = 1; i < len / 2 + 1; i++) //i为周期 13 { 14 for (j = 0; j < len - i; j++) 15 { 16 if (str[j] != str[j + i]) 17 break; 18 } 19 20 if (j == len - i) 21 { 22 result = i; 23 break; 24 } 25 } 26 printf("%d ",result); 27 28 return 0; 29 }
写法2:
1 #include <stdio.h> 2 #include <string.h> 3 int main(void) 4 { 5 char word[100]; 6 scanf("%s", word); 7 int len = strlen(word); 8 int i, j; 9 10 for (i = 1; i <= len; i++) 11 { 12 if (len % i == 0) 13 { 14 int ok = 1; 15 for (j = i; j < len; j++) 16 if (word[j] != word[j % i]) 17 { 18 ok = 0; 19 break; 20 } 21 if (ok) 22 { 23 printf("%d ", i); 24 break; 25 } 26 } 27 } 28 29 return 0; 30 }
解析:本题两种解法的思路是一致的。
4题:编写一个函数,把一个char组成的字符串循环右移n位。例如:原来是”abcdefghi”,如果n = 2,移位后应该是”hiabcdefg”。(面试题)
1 #include <stdio.h> 2 #include <string.h> 3 #define MAX_LEN 1024 4 5 void LoopMove_1(char *pStr, int steps) 6 { 7 int len = strlen(pStr) - steps; 8 char temp[MAX_LEN]; 9 10 strcpy(temp, pStr + len); 11 strcpy(temp + steps, pStr); 12 *(temp + steps + len) = '