您的位置:首页 > 其它

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

2013-08-01 17:26 375 查看

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



题目来源: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐