zoukankan      html  css  js  c++  java
  • 第八十八题(金山笔试题,字符串移动)

    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;
    }

    执行结果:


  • 相关阅读:
    【HDU1724】Ellipse-自适应Simpson积分法
    【HDU1724】Ellipse-自适应Simpson积分法
    【51Nod1227】平均最小公倍数-杜教筛
    【51Nod1227】平均最小公倍数-杜教筛
    【HDU5628】Clarke and math-狄利克雷卷积+快速幂
    【HDU5628】Clarke and math-狄利克雷卷积+快速幂
    deleted
    deleted
    deleted
    deleted
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6779952.html
Copyright © 2011-2022 走看看