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 != '\0' )
 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 != '\0' )
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 != '\0' )
35     {
36         int count = FindSubString( p1 );
37         if ( count > 0 )
38         {
39             *p2++ = *p1;
40             sprintf( p2, "%i", count );
41             while ( *p2 != '\0' )
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 ,且跟随一个 ‘\0’ (该函数自动产生的) , 此时,字符串变为 A1‘\0’BA 。经过    while ( *p2 != '\0' ) 循环之后, p2 指向 A1‘\0’BA , p1 += count + count + 1 之后, p1 指向 A1‘\0’BA 。此时字符串已经被改动,之前的 ABABA 已经不存在,变为 A1‘\0’BA 。

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

转载于:https://www.cnblogs.com/letgo/p/5785317.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值