LintCode 1380 Log Sorting (LeetCode 937 Reorder Log Files)

54 篇文章 2 订阅
10 篇文章 0 订阅

思路

  • 重写比较器对日志内容为字母的日志进行排序:其中可以调用String的compareTo方法,因为其返回值符合比较器的compare函数的返回值规则。具体实现:首先利用String的indexOf找到第一个空格的位置,然后就可以把原日志分成id与内容两个字符串。然后就可以按照规则进行比较了。
  • 主函数的实现:用一个list存字母型日志,方便后面直接调用sort方法排序。倒着遍历所有日志,遇到数字型日志就放到结果数组res的最后(因为正向遍历的话就无法提前知道一共有多少个字母型日志,所以数字型日志的存放位置就无法得到)。最后将排序后的字母型日志依次放到结果数组res里即可。

代码

此处为LintCode 1380的代码,与LeetCode 937可能稍有不同

public class Solution {
    /**
     * @param logs: the logs
     * @return: the log after sorting
     */
     
    class MyComparator implements Comparator<String> {
        // for the log with a content of letter
        public int compare(String s1, String s2) {
            // index of the 1st space 
            int space_s1 = s1.indexOf(' ');
            int space_s2 = s2.indexOf(' ');
            
            // id
            String id_s1 = s1.substring(0, space_s1);
            String id_s2 = s2.substring(0, space_s2);
            
            // content
            String cont_s1 = s1.substring(space_s1 + 1);
            String cont_s2 = s2.substring(space_s2 + 1);
            
            if(cont_s1.equals(cont_s2)) {
                return id_s1.compareTo(id_s2);
            } else {
                return cont_s1.compareTo(cont_s2);
            }
        }
        
    }
    
    public String[] logSort(String[] logs) {
        // Write your code here
        List<String> log_letter = new ArrayList<>();
        String[] res = new String[logs.length];
        int index = logs.length - 1;
        
        for(int i = logs.length - 1; i >= 0; i--) {
            String s = logs[i];
            int space = s.indexOf(' ');
            String cont = s.substring(space + 1);
            // content may start with a blank
            char c = cont.trim().charAt(0);
            if('0' <= c && c <= '9') {
                res[index--] = s; 
            } else {
                log_letter.add(s);
            }
        }
        
        Collections.sort(log_letter, new MyComparator());
        
        index = 0;
        for(String s : log_letter) {
            res[index++] = s;
        }
        
        return res;
    }
}

复杂度

时间复杂度 O ( n ∗ k + m ∗ l o g ( m ) ) O(n*k+m*log(m)) O(nk+mlog(m)): n为所有日志条数,m为字母型日志条数, k为日志平均长度(id+content)
空间复杂度 O ( n ∗ k ) O(n*k) O(nk)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值