第八十八题(金山笔试题,字符串移动)

来源:互联网 发布:iphone5s联通4g网络 编辑:程序博客网 时间:2024/05/01 07:27
88.2005 年11 月金山笔试题。编码完成下面的处理函数。

函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)。


思路:使用小标i和j分别来遍历字符串中的*字符和非*字符。

首先使下标j要跳过字符串最后面的非*字符(如果有的话),然后在while循环里执行这样的操作:移动j到当前位置的下一个非*字符处,移动过程中记录经过的*个数,移动i到当前位置的下一个*字符处,交换j,i处字符,重复上面的操作直到遍历到字符串起始位置。

C++代码:

#include<iostream>using namespace std;namespace MS100P_88{int  strMove(char* str){int i = strlen(str)-1;//i遍历字符串中的*int j = i;//j遍历字符串中的非*字符int count = 0;while (j > 0 && str[j] != '*') j--;  //跳过最后面的非'*'字符while (j >= 0&&i>=0){while (str[i] != '*'&&i >= 0)i--;while (str[j] == '*'&&j >=0){j--;count++;}str[i--] = str[j];str[j--] = '*';}return count;}void test(){char str[] = "ab**cd**e*12";cout << str << endl;cout << "num of * is: " << strMove(str) << endl;cout << str << endl;}}int _tmain(int argc, _TCHAR* argv[]){MS100P_88::test();return 0;}

运行结果:


0 0
原创粉丝点击