某筆試題目--修復迴文

  最近校園招聘又開始了,有一些讀研的大學同窗問我一些筆試時遇到的面試題目,今天有一題感受挺有意思,就寫了一下。在此跟你們分享一下。題目以下:面試

  所謂迴文,就是正序和倒序遍歷結果同樣的字符串,好比'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;
}

題目比較水,發到首頁不知道會不會被吐槽。

相關文章
相關標籤/搜索