最近校園招聘又開始了,有一些讀研的大學同窗問我一些筆試時遇到的面試題目,今天有一題感受挺有意思,就寫了一下。在此跟你們分享一下。題目以下:面試
所謂迴文,就是正序和倒序遍歷結果同樣的字符串,好比'aba', 'abcdedcba'。實現一個方法pal(),輸入一個字符串,打印出以這個字符串爲前綴的一個迴文。好比輸入'abc',pal()方法打印出'abcdcba'或'abcba';輸入'abcb',能夠輸出'abcbcba'或'abcba'。若是可能,輸出儘可能短的結果。ui
分析以下:spa
以abcdc爲例,以此爲前綴的迴文有 'abcdccdcba', 'abcdcdcba','abcdcba',即在輸入的字符串後面添加字符,使之成爲迴文字符串code
方法1、最早想到的辦法就是把輸入的字符串倒序拼接在原字符串後面,如原字符串爲'abcdc',倒序爲'cdcba',拼接的結果爲'abcdccdcba',而後不斷刪除倒序的字符,拼接上去,判斷是不是迴文,是,則輸出,不是,則繼續刪除字符。好比:blog
1)'abcdcdcba'是迴文字符串
2)'abcdccba'不是迴文string
3)'abcdcba'是迴文io
最後一個是迴文的字符串即未最短的迴文字符串。class
代碼以下:遍歷
1 #include<stdio.h> 2 #include<string.h> 3 4 #define MAXLEN 100 5 6 int isHuiWen(char *s) 7 { 8 char *s1 = s + strlen(s) - 1; 9 10 while(s < s1) 11 { 12 if(*s++ != *s1--) 13 { 14 return 0; 15 } 16 } 17 return 1; 18 } 19 20 void pal(char *s) 21 { 22 char s1[MAXLEN] = ""; 23 char s2[MAXLEN] = ""; 24 int len = strlen(s); 25 int i = 0; 26 27 for(i = 0;i < len;i++) 28 { 29 s1[i] = s[len - i - 1]; 30 } 31 32 for(i = 0;i < len;i++) 33 { 34 strcpy(s2, s); 35 if(isHuiWen(strcat(s2, s1 + i))) 36 { 37 printf("%s\n", s2); 38 } 39 } 40 } 41 42 int main() 43 { 44 char s[MAXLEN]; 45 46 while(scanf("%s", s) != EOF) 47 { 48 pal(s); 49 } 50 51 return 0; 52 }
方法一思路簡單、明瞭,不易出錯。但要到最後才能找到最短的一個迴文。方法二則介紹如何先找到最短的迴文。
方法二:
若須要找最短的迴文,則要求在原字符串後面新添的字符串長度儘可能短。只要在原字符串中找到某一位置,在此位置(含)後面全爲迴文,只要把此位置前的字符倒序追加在原字符串後便可。故只須要找出最前的該位置便可。
代碼以下:
#include<stdio.h> #include<string.h> #define MAXLEN 100 int isHuiWen(char *s) { char *s1 = s + strlen(s) - 1; while(s < s1) { if(*s++ != *s1--) { return 0; } } return 1; } void pal(char *s) { char s1[MAXLEN] = ""; int len = strlen(s); int i = 0; strcpy(s1, s); for(i = 0;i < len;i++) { /*找到位置i,使i(含)後的字符串爲迴文*/ if(isHuiWen(s + i)) { int k = len; /*將i以前的字符倒序添加在s後*/ while(i--) { s1[k++] = s[i]; } s1[k] = '\0'; printf("%s\n", s1); break; } } } int main() { char s[MAXLEN]; while(scanf("%s", s) != EOF) { pal(s); } return 0; }
題目比較水,發到首頁不知道會不會被吐槽。