题目:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,不能申请额外的空间。
题目来源: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;
}
题目要求不改变字符相对位置,将大写字母移到字符串后面。可通过冒泡排序实现,从后往前遍历,遇到大写字母则交换。若字符串包含非英文字母,程序退出并设置错误标记。另一种解法是先分别逆置大写和小写字母,再整体逆置字符串,利用循环移位原理。
995

被折叠的 条评论
为什么被折叠?



