将字符串中的字符'*'移到串的前部分(联发科实习生笔试题)

example: ab**cd**e*12

处理后结果为:*****abcde12,函数返回值5

 

这个题目类似于上一个题,即使用快慢指针解决。本以为不难,但是还是有点区别,因为这道题的快慢指针的初始化是在串的最后一个字符,然后往前移,而终止条件是第一个字符,上一道题的终止条件是最后一个字符的下一个字符。

 

[cpp]   view plain copy
  1. /*     
  2. * Copyright (c) 2011 alexingcool. All Rights Reserved.     
  3. */  
  4. #include <iostream>  
  5.   
  6. #define NUMBER 1000  
  7.   
  8. using namespace std;  
  9.   
  10. char source[] = "ab**cd**e*12";  
  11. const int size = sizeof source / sizeof *source;  
  12.   
  13. int moveStar(char *array, int size)  
  14. {  
  15.     char *fast = array + size - 1, *slow = array + size - 1;  
  16.     int num;  
  17.   
  18.     while(fast != array) {  
  19.         if(*fast != '*') {  
  20.             *slow = *fast;  
  21.             slow--;  
  22.         }  
  23.         fast--;  
  24.     }  
  25.   
  26.     *slow-- = *fast;  
  27.     num = slow - array + 1;  
  28.   
  29.     while(slow != array)  
  30.         *slow-- = '*';  
  31.     *slow = '*';  
  32.   
  33.     return num;  
  34. }  
  35.   
  36. void main()  
  37. {  
  38.     int starNumber = moveStar(source, size);  
  39.   
  40.     cout << "source = " << source << endl;  
  41.     cout << "starNumber = " << starNumber << endl;  
  42. }  


结果如下:

上面的代码有个bug,总体思路是对的,当输入为*ab**cd**e*12时,出现错误,需要做一个小改动

 

[cpp]   view plain copy
  1. int moveStar(char *array, int size)    
  2. {    
  3.     char *fast = array + size - 1, *slow = array + size - 1;    
  4.     int num;    
  5.   
  6.     while(fast != array - 1) {    
  7.         if(*fast != '*') {    
  8.             *slow = *fast;    
  9.             slow--;    
  10.         }    
  11.         fast--;    
  12.     }    
  13.    
  14.     num = slow - array + 1;    
  15.   
  16.     while(slow != array)    
  17.         *slow-- = '*';    
  18.     *slow = '*';    
  19.   
  20.     return num;    
  21. }    


结果:

 


转载于:https://www.cnblogs.com/wb118115/archive/2012/06/06/2538350.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值