• 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 。

  • 相关阅读:
    学习工具
    Qt 之 QApplication
    Qt中常用的类
    关于在Qt里让程序休眠一段时间的方法总结
    Qt setWindow setViewPort
    ajax回调数据 Structs has detected an unhandled exception 问题
    Struts2配置拦截器自定义栈时抛异常:Unable to load configuration.
    es6之map解构数组去重
    ES6之对象的方法
    ES6之genorator和yield使用(迭代器)
  • 原文地址:https://www.cnblogs.com/letgo/p/5785317.html
Copyright © 2020-2023  润新知