题目描述
考拉有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
AC代码1
题目本身不难,就是判断字典序那一块情况比较多,麻烦点
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[] strs = new String[n];
for(int i = 0;i < n;i++) strs[i] = in.next();
boolean dicOrder = true;
boolean lenOrder = true;
for(int i = 0;i < n - 1;i++){
int j = i + 1;
if(strs[i].length() > strs[j].length()) lenOrder = false;
int p = 0, q = 0;
for(;p < strs[i].length() && q < strs[j].length();p++, q++){
if(strs[i].charAt(p) > strs[j].charAt(q)) {
dicOrder = false;
break;
}
else if(strs[i].charAt(p) == strs[j].charAt(q)) continue;
else {
p++;
q++;
break;
}
}
if(p - 1 >= 0 && strs[i].charAt(p - 1) == strs[j].charAt(q - 1) && strs[i].length() > strs[j].length()) {
System.out.println("none");
return;
}
if(dicOrder == false && lenOrder == false) {
System.out.println("none");
return;
}
}
if(dicOrder && lenOrder) System.out.println("both");
else if(dicOrder == true && lenOrder == false) System.out.println("lexicographically");
else System.out.println("lengths");
}
}
AC代码2
当然,判断两个字符串的字典序可以用 string 内置的compareTo方法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
String[] words = new String[n];
for (int i = 0; i < n; i ++) {
words[i] = scanner.next();
}
System.out.println(validate(words));
}
scanner.close();
}
private static String validate(String[] words) {
boolean isABC = isAbc(words);
boolean isLEN = isLen(words);
if (isABC && isLEN) {
return "both";
}
if (isABC) {
return "lexicographically";
}
if (isLEN) {
return "lengths";
}
return "none";
}
private static boolean isLen(String[] words) {
boolean result = true;
for (int i = 1; i < words.length; i++) {
if (words[i].length() <= words[i - 1].length()) {
result = false;
break;
}
}
return result;
}
private static boolean isAbc(String[] words) {
boolean result = true;
for (int i = 1; i < words.length; i++) {
if (words[i].compareTo(words[i - 1]) <= 0) {
result = false;
break;
}
}
return result;
}
}
AC代码3
很优秀的代码
a, arr = input(), []
for i in range(int(a)):
arr.append(input())
lenarr, lexarr = sorted(arr, key=len), sorted(arr)
if arr == lenarr and arr == lexarr:
print("both")
elif arr == lenarr:
print("lengths")
elif arr == lexarr:
print("lexicographically")
else:
print("none")