[编程题]字符串排序

字符串排序

给定 n个字符串,请你对这 n个字符串按照以下规则从小到大排序。

对于任意两个字符串 s 和 t,在排序后应当满足:

- 若 s 是 t 的一个前缀,则 s 在排序后的下标小于等于 t 的在排序后的下标。- 若存在整数 ii ,使得 s 的前 i−1 个字符和 t 的前 i−1 个字符相同,且 s 和 t 的第 i 个字符不同,则比较第 i 个字符的大小关系(字符的大小关系顺序由输入数据给出)。若 s 的第 i 个字符小于等于 t 的第 i 个字符,则 s 在排序后的下标小于等于 t 的在排序后的下标。

容易发现,上述排序方法的排序结果是唯一的。

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 256M,其他语言512M

输入描述:

第一行输入一个字符串,包含 26 个互不相同的小写字母。记 rank(c) 表示字母 c 是该字符串的第 rank(c) 个字符,则字母 a 小于等于字母b  当且仅当  rank(a) <= rank(b)。

第二行输入一个整数 n [1, 1000] ,表示待排序字符串的数量。

接下来 n 行,每行一个仅包含小写字母的字符串 si (|si| <= 1000)  ,表示一个待排序的字符串。

输出描述:

按照排序后字符串位置下标从小到大的顺序输出 n 行,每行一个字符串,表示排序的结果。

示例1

输入例子:

abcdefghijklmnopqrstuvwxyz
3
aaa
aac
aaaa

输出例子:

aaa
aaaa
aac

示例2

输入例子:

zyxwvutsrqponmlkjihgfedcba
3
aaa
aac
aaaa

输出例子:

aac
aaa
aaaa

代码如下:

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        String letters = in.next();
        char[] lettersArray = letters.toCharArray();
        int[] letterWeight = new int[1024];
        for(int j = 0; j < lettersArray.length; j++) {
            int charValue = lettersArray[j];
            letterWeight[charValue] = j;
        }

        int n = in.nextInt();
        int i = 0;
        String[] strArray = new String[n];
        while(i < n) {
            strArray[i] = in.next();
            i++;
        }

        Arrays.sort(strArray, new Comparator<String>() {
            public int compare(String a, String b) {
                int ret = 0;
                int len = Math.min(a.length(), b.length());
                for (int i = 0; i < len; i++) {
                    int v1 = letterWeight[a.charAt(i)];
                    int v2 = letterWeight[b.charAt(i)];

                    ret = v1 - v2;
                    if (ret != 0) {
                        return ret;
                    }
                }

                
                return a.length() - b.length();
            }
        });

        for (String item : strArray) {
            System.out.println(item);
        }

        // 注意 hasNext 和 hasNextLine 的区别
        // while (in.hasNextInt()) { // 注意 while 处理多个 case
        //     int a = in.nextInt();
        //     int b = in.nextInt();
        //     System.out.println(a + b);
        // }
    }
}

全部评论

相关推荐

06-16 11:22
已编辑
暨南大学 golang
timeline:5.30投递,6.5一面,6.9二面,半小时后HR口头oc,6.11正式oc一面回忆版自我介绍介绍一下业务项目,讲一下抢购流程和项目难点,深入问了项目难点延伸问题1500的QPS是怎么设计的用什么工具进行压测压测的这些请求是一样的还是按照一定规则变化了解限流吗,项目里有实现吗go中什么数据结构是值拷贝,引用拷贝。讲一下slice和数组为什么go要引入slice和数组goroutine中只能用channel的,什么联系goroutine中怎么用锁的讲一下go的泛型讲一下go的接口讲一下了解的设计模式,讲了策略模式用过什么数据库,讲了Redis和MySQLMySQL和Redis的区别,它们的技术选型,应用场景,讲讲理解讲解对MySQL索引的理解有没有用过elasticsearch(只了解过)共享本地ide手撕反转链表http和tcp的区别开始比较随便的问题有没有用过腾讯云或者阿里云有没有用过k8s有没有用过docker项目怎么部署服务的,docker部署有什么优势有没有用什么ai辅助编程最近在读什么书是打算本科毕业还是读研深造反问二面回忆版自我介绍讲讲业务项目的难点亮点,以及整个抢购流程讲完以后一直在对项目进行拷打项目具体怎么部署的每个服务只部署一个实例吗怎么用rocketmq实现分布式事务的什么是熔断降级,项目中具体熔断限流策略怎么做的。八股问的不多分布式事务的特点MySQL事务go的底层知识,讲讲slice和channel的底层原理手撕三数之和变式,给定一个数组和目标值,在数组里找三个数,要求三个数之和最接近目标值,题目保证有且只有一个满足要求的情况最近在看什么书,学什么新知识反问
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务