字符串排序

描述: 

编写一个程序,将输入字符串中的字符按如下规则排序。

规则1:英文字母从AZ排列,不区分大小写。

      如,输入:Type 输出:epTy

规则2:同一个英文字母的大小写同时存在时,按照输入顺序排列。

    如,输入:BabA 输出:aABb

规则3:非英文字母的其它字符保持原来的位置。

    如,输入:By?e 输出:Be?y

样例:

    输入:

   A Famous Saying: Much Ado About Nothing(2012/8).

    输出:

   A aaAAbc dFgghhiimM nNn oooos Sttuuuy (2012/8).


 
知识点:  字符串,排序 
题目来源:  内部整理 
练习阶段:  中级 
运行时间限制: 10Sec
内存限制: 128MByte
输入:  


 
输出:  


 
样例输入:
A Famous Saying: Much Ado About Nothing (2012/8).

                   
样例输出:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

                    


明天有华为的so决赛,先做道题目压压惊,今天去机试犯的错误太蠢了,说是0xFFFFFFFF,结果我就把他当字符串了,其实人家输入的是数字,太坑。


这题,

首先,如果没有非字符串的话,就可以直接用冒泡算法,对于相等的,不用移动即可。但有非字母字符,最好的方法是什么?无法直接无视,因为前个字符要比较要跳过非字符,这是很麻烦的。还是直接先把非字符与字符分开,排序后再合并吧。

然后做出后,使用题目中这个看起来比较复杂的用例也顺利通过了,但是提交说错误。

这真是奇怪了?

#include <iostream>
#include <string>
#include <sstream>

#include <vector>

using namespace std;

bool bigThan(char a,char b){
	if(a >='a')
		a = a - 'a' + 'A';
	if(b >= 'a' )
		b = b - 'a' + 'A';
	if(a > b)
		return true;
	else
		return false;

}

void main(){
	string line;
	char Eng[1010],unEng[1010];
	int unEngSite[1010];
	int engNum = 0;
	int unEngNum =  0;
	getline(cin,line);
	for(int i = 0 ; i < line.length();i++){
		if( (line[i] >='a' && line[i] <= 'z') || (line[i] >='A' && line[i] <= 'Z') )
			Eng[engNum++] = line[i];
		else{
			unEng[unEngNum] = line[i];
			unEngSite[unEngNum++] = i;
			}
	}
	char temp;
	for( int i = 0 ; i < engNum - 1; i++){
		for( int j = 0 ; j < engNum - i -1;j++){
			if(bigThan(Eng[j],Eng[j+1])){
				temp = Eng[j+1];
				Eng[j+1] = Eng[j];
				Eng[j] = temp;
			}

		}
	}
	engNum = 0;
	unEngNum = 0;
	for(int i = 0;i<line.length();i++){
		if(i == unEngSite[unEngNum]){
			cout<<unEng[unEngNum++];
		}else{
			cout<<Eng[engNum++];
		}

	}

	cin>>engNum;
}


能给我用例吗?我感觉我自己做的完全正确,然后这个是我网上找到的,明显是错误的,用例“00.、,,、a”,直接出错,因为不能从后往前或从前往后去寻找比较的字符,因为如果没有,这就出错啊。
结果还是100%,答案就是这个。无语。
好想看用例到底是什么样的。

错误的答案代码

#include <iostream>
#include <string>
#include <ctype.h>
using namespace std;
int main()
{
	string str;
	getline(cin,str);
	int n=str.size();
	int i,j,temp;
	for (i=1;i<=n-1;i++)
	{
		for (j=n-1;j>=i;j--)
		{
			int k=j;
			if (isalpha(str[j]))
			{
				while(!isalpha(str[k-1]))
					k--;
				if (tolower(str[j])<tolower(str[k-1]))
				{
					temp=str[j];
					str[j]=str[k-1];
					str[k-1]=temp;
				}	 
			}
			else
				continue;
		}
	}
	cout<<str<<endl;
}

坑。




你可能感兴趣的:(字符串排序)