华为机试-HJ14 字符串排序

321 阅读1分钟

题目

image.png

image.png

www.nowcoder.com/practice/[5…](www.nowcoder.com/practice/5a…)

我的题解

他妹的、大脑一片空表

参考题解-方法1

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

public class Main {
    public static void main(String[] args) throws IOException {
        withArraysAPI();
    }

    // 方法一: 调用API Arrays.sort
    public static void withArraysAPI() throws IOException {
        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();

        Arrays.sort(ss);

        for (int i = 0; i < n; i++) {
            System.out.println(ss[i]);
        }
    }
}

image.png

总结: 1、 BufferedReader的一次完整调用、好的参考、已总结到专门文章里

2、Arrays.sort(ss); 这个方法这回知道了

高效题解和参考题解-方法1 思路一致、就是在输出那里实现不同

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

public class Main {
    public static void main(String[] args) throws IOException {
        withArraysAPI();
    }

    // 方法一: 调用API Arrays.sort
    public static void withArraysAPI() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = br.readLine();
        }
        br.close();

        StringBuilder sb = new StringBuilder();
        Arrays.sort(result);
        for (String w : result) {
            sb.append(w).append('\n');
        }
        System.out.println(sb.toString());
    }
}

image.png

总结: 1、StringBuilder 比循环执行System.out.println(ss[i]); 强30ms左右

        StringBuilder sb = new StringBuilder();
        Arrays.sort(result);
        for (String w : result) {
            sb.append(w).append('\n');
        }
        System.out.println(sb.toString());
        
        for (int i = 0; i < n; i++) {
            System.out.println(ss[i]);
        }

参考题解-方法2

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

public class Main {
    public static void main(String[] args) throws IOException {
        withPriorityQueue();
    }

    // 方法二: 使用PriorityQueue
    public static void withPriorityQueue() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        PriorityQueue<String> pq = new PriorityQueue<>();
        String s = "";
        while ((s = br.readLine()) != null) {
            pq.offer(s);
        }
        br.close();
 
        while (!pq.isEmpty()) {
            System.out.println(pq.poll());
        }       
    }
}

image.png

总结:

1、不解释、PriorityQueue抓紧时间恶补

参考题解-方法3

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

public class Main {
    public static void main(String[] args) throws IOException {
        withComparator();
    }

    // 方法三: 使用list并自己实现Comparator, 比较能体现算法的思路
    public static void withComparator() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        List<String> list = new ArrayList<>();
        String s = "";
        while ((s = br.readLine()) != null) {
            list.add(s);
        }
        br.close();

        list.sort(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                int i = 0;
                while (i < s1.length() && i < s2.length()) {
                    if (s1.charAt(i) != s2.charAt(i)) {
                        return (s1.charAt(i) > s2.charAt(i)) ? 1 : -1;
                    }
                    i++;
                }
                if (s1.length() == s2.length()) {
                    return 0;
                } else {
                    return (s1.length() > s2.length()) ? 1 : -1;
                }
            }
        });

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

image.png

总结;

1、list 和比较器也要巩固一下、然后再来吃这个写法