问题描述:
小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。你能帮帮小Q吗?
输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:对于每组数据,出移位输后的字符串。
输入例子:AkleBiCeilD
输出例子:kleieilABCD
方法一:
使用STL库中的stable_partation函数:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool isLower(char ch)
{
if (ch >= 'a' && ch <= 'z')
return true;
else
return false;
}
int main()
{
cout << "请输入字符串:";
string str;
while (getline(cin, str))
{
stable_partition(str.begin(), str.end(), isLower);
cout << str << endl;
str.clear();
}
cout << __DATE__ << " " << __TIME__ << endl;
system("pause");
return 0;
}
请输入字符串:aAbBcCdDEfGjJ
abcdfjABCDEGJ
^Z
Aug 28 2016 13:47:40
请按任意键继续. . .
方法二:
分析:从头到尾扫描字符串,如果遇到一个大写字母,则将该大写字母之后的所有字符向前移动一格,将该大写字母移动到字符串的最后边,直接扫描结束!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Function(char *arr, int len)
{
if (arr == NULL || len <= 1)
return;
int my_len = len;
for (int i = 0; i < my_len;)
{
if (arr[i] >= 'A' && arr[i] <= 'Z')
{
char ch = arr[i];//大写字母
for (int j = i + 1; j < len; ++j)
{
arr[j - 1] = arr[j];
}
arr[len - 1] = ch;//将大写字母赋予最后一位
--my_len;
}
else
i++;
}
printf("%s\n", arr);
}
int main()
{
char arr[1000];
memset(arr, 0, sizeof(arr));
while (scanf("%s", arr) != EOF)
{
Function(arr, strlen(arr));
memset(arr, 0, sizeof(arr));
}
printf("%s %s\n", __DATE__, __TIME__);
system("pause");
return 0;
}
注意:一定要使用cin或者scanf("%s", arr)来读取字符串,否则,容易造成错误!
方法三:
用CPP语言,思想和方法二的一致,只不过表达方式有些不一样!
#include<iostream>
#include<string>
using namespace std;
bool isCap(char c)
{
if (c >= 'A' && c <= 'Z')
return true;
else
return false;
}
void mSwap(char &a, char &b)
{
if (a != b)
{
a ^= b;
b ^= a;
a ^= b;
}
}
int main()
{
string s;
while (cin >> s)
{
int len = s.size();
int end = len;
for (int i = 0; i<end; ++i)
{
if (isCap(s[i]))
{
for (int j = i; j<len - 1; ++j)
mSwap(s[j], s[j + 1]);
--end;
--i;
}
}
cout << s << endl;
}
return 0;
}