zoukankan      html  css  js  c++  java
  • 5,一道经典的微软程序题

    一、题目描述



    In the main() function, after ModifyString(text) is called, what’s the value of ‘text’?

     1 int FindSubString( char* pch )
     2 {
     3     int   count  = 0;
     4     char  * p1   = pch;
     5     while ( *p1 != '' )
     6     {   
     7         if ( *p1 == p1[1] - 1 )
     8         {
     9             p1++;
    10             count++;
    11         }else  {
    12             break;
    13         }
    14     }
    15     int count2 = count;
    16     while ( *p1 != '' )
    17     {
    18         if ( *p1 == p1[1] + 1 )
    19         {
    20             p1++;
    21             count2--;
    22         }else  {
    23             break;
    24         }
    25     }
    26     if ( count2 == 0 )
    27         return(count);
    28     return(0);
    29 }
    30 void ModifyString( char* pText )
    31 {
    32     char  * p1   = pText;
    33     char  * p2   = p1;
    34     while ( *p1 != '' )
    35     {
    36         int count = FindSubString( p1 );
    37         if ( count > 0 )
    38         {
    39             *p2++ = *p1;
    40             sprintf( p2, "%i", count );
    41             while ( *p2 != '' )
    42             {
    43                 p2++;
    44             }
    45             p1 += count + count + 1;
    46         }else  {
    47             *p2++ = *p1++;
    48         }
    49     }
    50 }
    51 void main( void )
    52 {
    53     char text[32] = "XYBCDCBABABA";
    54     ModifyString( text );
    55     printf( text );
    56 }  

    二、分析 


      FindSubString() 函数就是要找到一个先递增再递减且递增和递减的数量相等的回文序列,例如: ABCDCBA ,先是   后一项 = 前一项 ASCII 码 +1 , 后是   后一项 = 前一项 ASCII 码 -1 ,才能返回回文子串的长度,否则返回 0 。

      ModifyString() 函数不断寻找上述类型的子串,如果不满足条件,就*p2++ = *p1++;当遇到 ABABA 中前一个 ABA 的时候,满足回文子串要求,此时 p1 指向 A BABA , p2 指向 ABABA ; sprintf 重定向修改 ABABA, B 变为 1 ,且跟随一个 ‘’ (该函数自动产生的) , 此时,字符串变为 A1‘’BA 。经过    while ( *p2 != '' ) 循环之后, p2 指向 A1‘’BA , p1 += count + count + 1 之后, p1 指向 A1‘’BA 。此时字符串已经被改动,之前的 ABABA 已经不存在,变为 A1‘’BA 。

      再次进入 while ( *p1 != '' ) 循环之后,只能执行 else 部分的命令, p1 指向 p2 指向的元素的后一个,不断将 p1 指向的元素传给p2 所指向的位置,将原数据覆盖。所以, A1‘’BA ,依次变为 A1BBA 、 A1BAA 。即最终结果为 XYBCDCBA1BAA 。

  • 相关阅读:
    git branch查看不到分支的名字解决办法
    input输入框如何只能输入非零开头的正整数
    如何修改git分支名名称
    JavaScript如何把字符串中每个单词首字母转化为大写
    JavaScript原型链的理解
    JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈
    Vue中父子组件执行的先后顺序探讨
    我是不是该回来写点东西
    转载:引用 struts2标签详解
    mysql的重装问题......我自己的心得
  • 原文地址:https://www.cnblogs.com/letgo/p/5785317.html
Copyright © 2011-2022 走看看