将字符串中的字符'*'移到串的前部分

example: ab**cd**e*12

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

 

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

 

/*    
* Copyright (c) 2011 alexingcool. All Rights Reserved.    
*/
#include <iostream>

#define NUMBER 1000

using namespace std;

char source[] = "ab**cd**e*12";
const int size = sizeof source / sizeof *source;

int moveStar(char *array, int size)
{
	char *fast = array + size - 1, *slow = array + size - 1;
	int num;

	while(fast != array) {
		if(*fast != '*') {
			*slow = *fast;
			slow--;
		}
		fast--;
	}

	*slow-- = *fast;
	num = slow - array + 1;

	while(slow != array)
		*slow-- = '*';
	*slow = '*';

	return num;
}

void main()
{
	int starNumber = moveStar(source, size);

	cout << "source = " << source << endl;
	cout << "starNumber = " << starNumber << endl;
}


结果如下:

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

int moveStar(char *array, int size)  
{  
	char *fast = array + size - 1, *slow = array + size - 1;  
	int num;  

	while(fast != array - 1) {  
		if(*fast != '*') {  
			*slow = *fast;  
			slow--;  
		}  
		fast--;  
	}  
 
	num = slow - array + 1;  

	while(slow != array)  
		*slow-- = '*';  
	*slow = '*';  

	return num;  
}  

结果:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值