码迷,mamicode.com
首页 > 编程语言 > 详细

华为训练题:中级——字符串排序(查找)

时间:2015-08-16 21:10:49      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

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

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

      如,输入:Type 输出:epTy

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

    如,输入:BabA 输出:aABb

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

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

样例:

    输入:

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

    输出:

   A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).

思路:这题我的思路是先将字符串中的字母都取出来,放到另外一个string中,然后在这个string中进行排序,

再将排好序的字符赋值给之前那个string中,覆盖掉对应的那些字母。

这其中由于字母不区分大小写,而且相同的要按之前的·顺序,我开始用冒泡做,结果发现错了

之后就想到用查找再插入的方法,遍历26遍,从a到z,依次找出后尾部插入到一个字符串中。

下面是AC的代码

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 
 5 void sorted2(string &str)
 6 {
 7     string str1;
 8     int len=str.size();
 9     for(int i=0;i<26;i++)
10     {
11         for(int j=0;j<len;j++)
12             if(str[j]==(A+i)||str[j]==(a+i))
13                 str1.push_back(str[j]);
14     }
15     str=str1;
16 }
17 /*
18 void sorted(string &str)
19 {
20     if(str.empty())
21         return;
22     int len=str.size();
23     if(str.size()==1)
24         return;
25     for(int i=0;i<len-1;i++)
26     {
27         for(int j=i+1;j<len;j++)
28         {
29             char a,b;
30             if(str[i]>=‘a‘&&str[i]<=‘z‘)
31                 a=str[i]-32;
32             else
33                 a=str[i];
34             if(str[j]>=‘a‘&&str[i]<=‘z‘)
35                 b=str[j]-32;
36             else
37                 b=str[j];
38 
39             if(a>b)
40             {
41                 char temp;
42                 temp=str[i];
43                 str[i]=str[j];
44                 str[j]=temp;
45             }
46         }
47     }
48     return;
49 }
50 */
51 void ChangeWord(string &str)
52 {
53     if(str.empty()||str.size()==1)
54         return;
55     string str1;
56     for(string::iterator iter=str.begin();iter!=str.end();iter++)
57     {
58         if(((*iter)>=A&&(*iter)<=Z)||((*iter)>=a&&(*iter)<=z))
59             str1.push_back(*iter);
60     }
61     sorted2(str1);
62 
63     int j=0;
64     for(string::iterator i=str.begin();i!=str.end();i++)
65         if((*i>=A&&*i<=Z)||(*i>=a&&*i<=z))
66         {
67             *i=str1[j];
68             j++;
69         }
70     return;
71 }
72 
73 int main()
74 {
75     string str;//="A Famous Saying: Much Ado About Nothing";
76     getline(cin,str);
77     ChangeWord(str);
78     cout<<str<<endl;
79 
80     //system("pause");
81 }

华为训练题:中级——字符串排序(查找)

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4734919.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!