某笔试题目--修复回文

  最近校园招聘又开始了,有一些读研的大学同学问我一些笔试时遇到的面试题目,今天有一题感觉挺有意思,就写了一下。在此跟大家分享一下。题目如下:

  所谓回文,就是正序和倒序遍历结果一样的字符串,比如'aba', 'abcdedcba'。实现一个方法pal(),输入一个字符串,打印出以这个字符串为前缀的一个回文。比如输入'abc',pal()方法打印出'abcdcba'或'abcba';输入'abcb',可以输出'abcbcba'或'abcba'。如果可能,输出尽量短的结果。

  分析如下:

  以abcdc为例,以此为前缀的回文有 'abcdccdcba', 'abcdcdcba','abcdcba',即在输入的字符串后面添加字符,使之成为回文字符串

  方法一、最先想到的办法就是把输入的字符串倒序拼接在原字符串后面,如原字符串为'abcdc',倒序为'cdcba',拼接的结果为'abcdccdcba',然后不断删除倒序的字符,拼接上去,判断是否是回文,是,则输出,不是,则继续删除字符。比如:

           1)'abcdcdcba'是回文

           2)'abcdccba'不是回文

           3)'abcdcba'是回文

           最后一个是回文的字符串即未最短的回文字符串。

  代码如下:

  

 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;
}

题目比较水,发到首页不知道会不会被吐槽。

 

你可能感兴趣的:(笔试题)