把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。

题目要求不改变字符相对位置,将大写字母移到字符串后面。可通过冒泡排序实现,从后往前遍历,遇到大写字母则交换。若字符串包含非英文字母,程序退出并设置错误标记。另一种解法是先分别逆置大写和小写字母,再整体逆置字符串,利用循环移位原理。

题目:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。 

 
 

题目来源:http://blog.csdn.net/w397090770/article/details/8030317

同参考楼主的思想,也是用冒泡排序的思想求解。从字符串尾部扫描,将大写字母依次放到字符串的最后。

注意:如果字符串中包含不合法的字母(除了英文字母之外的字符,)则视为错误输入,程序会退出并设置错误标记invaluedInput为true。

#include <iostream>
#include <string>
using namespace std;

//标记输入参数是否合法
bool invaluedInput = false;

//是否为大写字符
bool IsUpper(char ch)
{
	if(ch>='A' && ch<='Z')
		return true;
	else
		return false;
}

//是否为合法字符(合法字符为a-z ,A-Z)
bool IsCharacter(char ch)
{
	if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
		return true;
	else
		return false;
}

void UpperBehindLower(char* str,int len)
{
	if(NULL == str || len<=1)
	{
		invaluedInput = true;
		return;
	}
	char tmpch;
	int ahead = len-1;
	int behind = len-1;
	int tmp;
	while(ahead >= 0)
	{
		if(IsCharacter(str[ahead]))
		{
			//如果为大写字符,则将大写字符后的所有小写字符移到此大写字符前
			if(IsUpper(str[ahead]))
			{
				tmpch = str[ahead];
				for(tmp = ahead; tmp<behind; tmp++)
				{
					str[tmp] = str[tmp+1];
				}
				str[tmp] = tmpch;
				behind--;
				ahead--;
			}
			else
				ahead--;
		}
		else
		{
			invaluedInput = true;
			cout<<"invaluedInput"<<endl;
			return ;
		}
	}
}

int main()
{
	//不同的测试用例
	//char str[] = "AaBCDcb";
//	char str[] = "ABCDabcd";
	//char str[] = "abcdABCD";
	//char str[] = "abcd";
	char str[] = "ABCD";
	int len = strlen(str);
	cout<<str<<endl;
	UpperBehindLower(str,len);
	if(!invaluedInput)
		cout<<str<<endl;
	else
		cout<<"invaluedInput"<<endl;
}

如果字符串的形式是形如:ABFJRFHfjdalkfka这种大写字母都在小写字母的前面,则可以采用如下解法:

1.将所有大写字母组成的字符串逆置。

2.将所有小写字母组成的字符串逆置。

3.将所有字符串逆置。

这种解法用的就是字符串循环移位的方法。

代码如下:
#include <iostream>
#include <string>
using namespace std;

bool invaluedInput = false;

//逆置字符串
bool ReverseStr(char* pAhead,char* pBehind)
{
	if(NULL == pAhead || NULL == pBehind)
	{
		return false;
	}
	char tmp;
	while(pAhead < pBehind)
	{
		tmp = *pAhead;
		*pAhead = *pBehind;
		*pBehind = tmp;
		pAhead++;
		pBehind--;
	}
	return true;
}

bool UpperBehindLower(char str[],int len)
{
	if(NULL == str || len < 2)
	{
		invaluedInput = true;
		return false;
	}
	//求字符串中大写字符串的长度
	int lenUpper = 0;
	while(str[lenUpper] >='A' && str[lenUpper] <= 'Z')
	{
		lenUpper++;
	}
	lenUpper--;
	//分别逆置大写字符串,小写字符串,整个字符串。
	ReverseStr(str,str+lenUpper);
	ReverseStr(str+lenUpper+1,str+len-1);
	ReverseStr(str,str+len-1);
	return true;
}

int main()
{
	//char str[] = "ABCDEabcdef";
	//char str[] = "Aabcdef";
	//char str[] = "abcdef";
	//char str[] = "ABCDEF";
	//char str[] = "Aa";
	char str[] = "A";
	int len = strlen(str);
	cout<<str<<endl;
	UpperBehindLower(str,len);
	if(invaluedInput)
		cout<<"invaluedInput"<<endl;
	else
		cout<<str<<endl;
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值