LeetCode每日一题 937. 重新排列日志文件 (字符串 \ 数组 \ 比较器)

在这里插入图片描述

思路

  1. 首先遍历每一个数组,然后判断数组中空格分隔的第二个元素是否是数字;如果是数字则加入数字集合;如果是单词,则加入单词集合
  2. 然后使用集合的排序,自定义比较器;根据题意,如果标识符后面的元素都相同,则使用标识符的字典序比较两字符串;否则后面元素不同,直接根据后面的元素的字典序比较即可

代码实现(java)

class Solution {
    public String[] reorderLogFiles(String[] logs) {
         List<String> wordList = new ArrayList<>();
        List<String> numList = new ArrayList<>();

        // 将字母串和数字串取出
        for(int i = 0; i < logs.length; i++) {
            char c = logs[i].split(" ")[1].charAt(0);
            if(c >= '0' && c <= '9') {
                numList.add(logs[i]);
            } else {
                wordList.add(logs[i]);
            }
        }

        Collections.sort(wordList, (String s1, String s2) -> {
            // 单词串的后半部分
            String lastStrA = s1.substring(s1.indexOf(' '));
            String lastStrB = s2.substring(s2.indexOf(' '));
            // 单词串的标识符
            String headA = s1.substring(0, s1.indexOf(' '));
            String headB = s2.substring(0, s2.indexOf(' '));

            // 如果后半部分相同,则使用标识符的比较
            if(lastStrA.equals(lastStrB)) {
                return headA.compareTo(headB);
            } else {
                return lastStrA.compareTo(lastStrB);
            }
        });

        // wordList后跟numList
        wordList.addAll(numList);
        // 转成String类型数组
        return wordList.toArray(new String[0]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值