zoukankan      html  css  js  c++  java
  • 某笔试题目--修复回文

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

      所谓回文,就是正序和倒序遍历结果一样的字符串,比如'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
    ", 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] = '';
                printf("%s
    ", s1);
                break;
            }
        }
    }
    
    int main()
    {
        char s[MAXLEN];
    
        while(scanf("%s", s) != EOF)
        {
            pal(s);
        }
    
        return 0;
    }

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

  • 相关阅读:
    Cocos2dx隐藏iOS7状态栏】通过添加Plist Key隐藏iOS7状态栏
    数论
    Large Division(大数取余模板)
    CodeForces
    2019山东第十届acm省赛 c Wandering Robot 即zoj4115
    CF1157A. Reachable Numbers
    E. Mishap in Club (CF 245E)
    ATcoder Big Array
    CF987B
    CF1013B And
  • 原文地址:https://www.cnblogs.com/renteng/p/3362465.html
Copyright © 2011-2022 走看看