两种排序方法 网易2017内推编程题

考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
"car" < "carriage" < "cats" < "doggies < "koala"
2.根据字符串的长度排序。例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

输入描述:

输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成

输出描述:

如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically", 如果根据长度排列而不是字典序排列输出"lengths", 如果两种方式都符合输出"both",否则输出"none"

输入例子:

3

a

aa

bbb

输出例子:

both

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <unordered_map>
 5 #include <string>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int n;
11     cin >> n;
12 
13     vector<pair<int, int> > vecLen;
14     vector<pair<string, int> > vecLex;
15     string str;
16     int cnt = 0;
17 
18     //生成vecLen和vecLex
19     for (int i = 0; i < n; i++)
20     {
21         cin >> str;
22         vecLen.push_back(make_pair(str.size(), cnt));
23         vecLex.push_back(make_pair(str, cnt));
24         cnt++;
25     }
26 
27     //按照vector[].first进行排序
28     //如果字符串组是按照长度排序,vecLen排序后不变
29     //如果字符串组是按照字母排序,vecLex排序后不变
30     sort(vecLen.begin(), vecLen.end());
31     sort(vecLex.begin(), vecLex.end());
32 
33     //判断vecLen和vecLex排序后顺序是否改变
34     bool bLen = true;
35     bool bLex = true;
36     for (int i = 0; i < n; i++)
37     {
38         if (vecLen[i].second != i)
39         {
40             bLen = false;
41             break;
42         }
43     }
44     for (int i = 0; i < n; i++)
45     {
46         if (vecLex[i].second != i)
47         {
48             bLex = false;
49             break;
50         }
51     }
52 
53     //输出结果  
54     if (bLex && bLen)
55         cout << "both" << endl;
56     else if (bLex && !bLen)
57         cout << "lexicographically" << endl;
58     else if (!bLex && bLen)
59         cout << "lengths" << endl;
60     else
61         cout << "none" << endl;
62 }
posted @ 2016-08-08 13:28  Pearl_zju  阅读(459)  评论(0编辑  收藏  举报