当前位置 博文首页 > Scissors_初夏的博客:初夏小谈:[NK]:两种排序方法
题目描述
考拉有n个字符串字符串,任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序。例如:
"car" < "carriage" < "cats" < "doggies < "koala"
2.根据字符串的长度排序。例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。输入描述:
输入第一行为字符串个数n(n ≤ 100) 接下来的n行,每行一个字符串,字符串长度均小于100,均由小写字母组成输出描述:
如果这些字符串是根据字典序排列而不是根据长度排列输出"lexicographically", 如果根据长度排列而不是字典序排列输出"lengths", 如果两种方式都符合输出"both",否则输出"none"示例1
输入
3 a aa bbb输出
both
解题思路:
根据题意,就是判断出来长度是否符合条件和所有字符串符合字典序。并且对这两种情况的不同组合进行分别打印不同的语句。
长度的排序比较简单,就是一一比较相邻的字符串长度,发现一个不符合就不符合长度排序。
对于字典序,像查字典一样,先比较相邻字符串的第一个字母,三种情况:
- 1.前一个字符串首字母小于后一个字符串首字母时直接判断下一对。
- 2.前一个字符串首字母大于后一个字符串首字母时直接停止,不符合。
- 3.则前一个字符串首字母等于后一个字符串首字母时,就需要接着比较两个字符串下一个字母,重复一个步骤
实例代码:
#include<iostream> using namespace std; #include<vector> #include<string> void Dispose(vector<string>& v) { int LengthFlag = 0; int ZiDianXuFlag = 0; int size = v.size(); if(v.size() == 1) { cout<<"both"<<endl; return; } for(int i = 0; i < size - 1; i++) { if(v[i].size() > v[i+1].size()) { LengthFlag = 1; break; } } for(int i = 0; i < size - 1; i++) { int SizeStr = v[i].size(); for(int j = 0; j < SizeStr; j++) { if(v[i][j] < v[i+1][j]) { break; } if(v[i][j] > v[i+1][j]) { ZiDianXuFlag = 1; break; } } } if(ZiDianXuFlag == 0 && LengthFlag == 1) { cout<<"lexicographically"<<endl; } else if(ZiDianXuFlag == 1 && LengthFlag == 0) { cout<<"lengths"<<endl; } else if(ZiDianXuFlag == 0 && LengthFlag == 0) { cout<<"both"<<endl; } else { cout<<"none"<<endl; } } int main() { vector<string> v; string str; int count = 0; while(cin>>count) { for(int i = 0; i < count; i++) { cin>>str; v.push_back(str); str.clear(); } Dispose(v); } return 0; }
cs在做题中遇到的问题:
? ? ? ? ? 1.由于粗心在输入字符串时直接用v[i]来接收。vector都没数据空间怎么能以数组的形式存放。
? ? ? ? ? 2.判断字典序时,考虑不周,一开始只考虑了第三种情况。造成只通过一部分测试用例。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 珍&源码
下一篇:没有了