两种排序方法

题目描述

考拉有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")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值