Java写题解的第二天 | #字符串排序#

字符串排序

http://www.nowcoder.com/practice/5af18ba2eb45443aa91a11e848aa6723

今天是2021-07-23,首先恭喜这道题最后一组测试用例已经被修复了 👍 👍

图片说明

只需要按字典排列字符串,可以调用Arrays.sort API,也可以使用PriorityQueue,还可以自己实现Comparator,三种方法测试了一下用时相差不大。


代码已于2022年7月9日更新:根据评论做出了一些修改,添加了一些API方法,消除了一些坏味道,添加了更多的注释。

import java.io.*;
import java.util.*;

public class Main {
    // API中的sort方法大多使用快排或者归并排序;
    // stream可以更方便写代码,但在不同数据量但情况下效率不同,姑且可以认为更耗时
    public static void main(String[] args) throws IOException {
        withPriorityQueue();
    }

    // 方法一: 调用API实现
    public static void withArraysAPI() throws IOException {
        // read and store strings in an array from input stream
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] ss = new String[n];
        for (int i = 0; i < n; i++) {
            ss[i] = br.readLine();
        }
        br.close();

        // use stream to sort and output strings, which may use more time
        Arrays.stream(ss).sorted().forEach(System.out::println);

        // alternatively, use Arrays.sort(Object[] a) and for loop to output, which may use less time
    }

    // 方法二: 使用PriorityQueue
    public static void withPriorityQueue() throws IOException {
        // read and store strings in a priority queue from input stream
        PriorityQueue<String> pq = new PriorityQueue<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine(); // read the first line, but the number will not be used.
        String s;
        while ((s = br.readLine()) != null) {
            pq.offer(s);
        }
        br.close();

        // output
        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }
    }

    // 方法三: 使用list并自己实现Comparator
    public static void withComparator() throws IOException {
        // read and store strings in a list from input stream
        List<String> list = new ArrayList<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        br.readLine(); // read the first line, but the number will not be used.
        String s;
        while ((s = br.readLine()) != null) {
            list.add(s);
        }
        br.close();

        // sort with self defined comparator
        list.sort((s1, s2) -> {
            int i = 0;
            while (i < s1.length() && i < s2.length()) {
                if (s1.charAt(i) > s2.charAt(i)) {
                    return 1;
                } else if (s1.charAt(i) < s2.charAt(i)) {
                    return -1;
                } else {
                    i++;
                }
            }
            return s1.length() - s2.length();
        });

        // indeed, default comparator works for this case
        // list.sort(null);
        // or you may use Collections.sort method to avoid null
        // Collections.sort(list);

        // output
        list.forEach(System.out::println);
    }
}
全部评论
大佬,我们还在这Scan呢,大佬已经用流式计算lambda表达式做题了
1 回复 分享
发布于 2022-10-12 21:08 广东
老哥6666啊
点赞 回复 分享
发布于 2021-08-11 19:04
这个好
点赞 回复 分享
发布于 2021-08-14 06:41
请教一下,第58行为什么不能直接if判断s1.charAt(i)>s2.charAt(i),true return 1 呢?
点赞 回复 分享
发布于 2021-09-16 12:00
太棒了
点赞 回复 分享
发布于 2022-01-05 17:14
list试试使用lambda表达式。
点赞 回复 分享
发布于 2022-02-08 18:32
还可以使用sortedMap 的键自动排序功能,只是性能差点
点赞 回复 分享
发布于 2022-02-16 14:47
方法三可以直接用Collections.sort()排序,如果不是按字典排序,再重写。
点赞 回复 分享
发布于 2022-02-26 16:02
很有帮助,但是感觉方法3的逻辑不是很清晰~
点赞 回复 分享
发布于 2022-04-16 11:49
我的第三种超时了
点赞 回复 分享
发布于 2022-05-16 11:32
tql
点赞 回复 分享
发布于 2022-05-24 14:19
第二个方法的n是作用是什么
点赞 回复 分享
发布于 2022-07-03 02:26
请问自定义比较器里,可不可以直接用string的compareTo来返回结果啊
点赞 回复 分享
发布于 2022-07-27 23:32
写得好
点赞 回复 分享
发布于 2022-08-26 02:37 陕西
谢谢,每种方法基本都学到了东西
点赞 回复 分享
发布于 2022-12-02 13:10 美国
你被录取了。
点赞 回复 分享
发布于 2023-03-09 09:34 陕西
方法2只有输入没有结束呢
点赞 回复 分享
发布于 2023-10-16 15:46 江苏

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
136 42 评论
分享
牛客网
牛客企业服务