华为机试再回忆--第三题

题目:字符串比较排序

描述:1.字符串由大小写字母,数字及空格组成,一个或者多个空格将多个字符串隔开

       2.解析出各字符串

       3.输出结果时,将各个子串按长度从大到小排序,如果长度一样,按照小写字母>大写字母>数字 进行排序

       4.输出结果时,一个空格隔多个子串

 

样例输入:w23r  at 1rt  Af w13r

样例输出:w13r w23r 1rt at Af

 

本题几个注意的地方:

1.输入用getline才能输入空格

2.字符串解析出来后,用一个辅助数组保存各个字符串长度然后再使用辅助串长度对字符串进行交换

3.由于长度一样的时候按照小写字母>大写字母>数字排序,正好可使用strcmp

 

代码实现如下:

复制代码
  1 #include <iostream>
  2 #include <string>
  3 using namespace std;
  4 
  5 #define  StrSize 100
  6 
  7 int main()
  8 {
  9 
 10     string OriginalStr;
 11     getline(cin,OriginalStr);
 12 
 13 
 14 
 15     int index=0;
 16     int j=0;
 17     int count=0;
 18     while(true)
 19     {
 20         if(OriginalStr[index]!=' ')
 21         {
 22             j++;
 23             index++;
 24         }
 25         else
 26         {
 27             index++;
 28             j=0;
 29         }
 30 
 31         if(OriginalStr[index-1]==' '&&OriginalStr[index]!=' ')
 32         {
 33             count++;
 34         }
 35 
 36         if(index>=OriginalStr.length())
 37             break;
 38     }
 39 
 40     count=count+1;
 41 
 42     char **StrArray=new char *[count];
 43     for(int i=0;i<count;i++)
 44     {
 45         StrArray[i]=new char[StrSize];
 46     }
 47 
 48     for(int i=0;i<count;i++)
 49         for(int j=0;j<StrSize;j++)
 50             StrArray[i][j]='\0';
 51 
 52     index=0;
 53     j=0;
 54     int k=0;
 55     while(true)
 56     {
 57         if(OriginalStr[index]!=' ')
 58         {
 59             StrArray[k][j++]=OriginalStr[index++];
 60         }
 61         else
 62         {
 63             index++;
 64             j=0;
 65         }
 66 
 67         if(OriginalStr[index-1]==' '&&OriginalStr[index]!=' ')
 68         {
 69             k++;
 70         }
 71 
 72         if(index>=OriginalStr.length())
 73             break;
 74     }
 75 
 76     int *LenArr=new int[count];
 77     for(int i=0;i<count;i++)
 78     {
 79         LenArr[i]=strlen(StrArray[i]);
 80     }
 81 
 82     for(int i=0;i<count;i++)
 83     {
 84         for(int j=i;j<count;j++)
 85             if(LenArr[i]<LenArr[j])
 86             {
 87                 char *temp;
 88                 temp=StrArray[i];
 89                 StrArray[i]=StrArray[j];
 90                 StrArray[j]=temp;
 91 
 92                 int tempint;
 93                 tempint=LenArr[i];
 94                 LenArr[i]=LenArr[j];
 95                 LenArr[j]=tempint;
 96             }
 97     }
 98 
 99 
100     for(int i=0;i<count-1;i++)
101     {
102         if(LenArr[i]==LenArr[i+1])
103         {
104             if(strcmp(StrArray[i],StrArray[i+1])<0)
105             {
106                 char *temp;
107                 temp=StrArray[i];
108                 StrArray[i]=StrArray[j];
109                 StrArray[j]=temp;
110             }
111         }
112     }
113 
114 
115     for(int i=0;i<count;i++)
116     {
117         cout<<StrArray[i]<<" ";
118     }
119     cout<<endl;
120 
121     for(int i=0;i<count;i++)
122     {
123         delete[] StrArray[i];
124     }
125     delete[] StrArray;
126     StrArray=NULL;
127     system("pause");
128     return 0;
129 }
复制代码

运行截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值