位元組跳動2019屆校招筆試題二
阿新 • • 發佈:2018-12-16
2.為了提高文章質量,每一篇文章(假設全部都是英文)都會有m民編輯進行稽核,每個編輯獨立工作,會把覺得有問題的句子通過下表記錄下來,比如[1,10],1表示病句的第一個字元,10表示病句的最後一個字元。也就是從1到10著10個字元組成的句子,是有問題的。
現在需要把多名編輯有問題的句子合併起來,送個總編輯進行最終的稽核。比如編輯A指出的病句是[1,10],[32,45];編輯B指出的病句是[5,16],[78,94]那麼[1,10]和[5,16]是有交叉的,可以合併成[1,16][32,45][78,94]
輸入描述:
編輯數量m,之後每行是每個編輯的標記的下表組合,第一個和最後一個下標用英文逗號分隔,每組下標之間用分號分隔
輸出描述:
合併後的下標集合,第一個和最後一個下標用英文逗號分隔,每組下標之間用分號分隔。返回結果是從小到大遞增排列
例:輸入
3
1,10;32,45
78,94;5,16
80,100;200,220;16,32
輸出: 1,45;78,100;200,220
java實現:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Problem2 { static String input = "3\n" + "1,10;32,45\n" + "78,94;5,16\n" + "80,100;200,220;16,32"; static class Range implements Comparable<Range>{ private int start; private int end; public Range(int start, int end) { this.start = start; this.end = end; } @Override public String toString() { return start +"," + end +";"; } @Override public int compareTo(Range o) { return start - o.start; } public boolean isCombine(Range o){ return end+1 >= o.start; } public Range combine(Range o){ if(isCombine(o)){ start = Math.min(start,o.start); end = Math.max(end,o.end); } return this; } } static void handleInput(){ String[] lines = input.split("\n"); List<Range> ranges = new ArrayList<>(10); for (int i = 1 ; i < lines.length; i++) { String[] pairs = lines[i].split(";"); for (String pair: pairs) { String[] se = pair.split(","); ranges.add(new Range(Integer.valueOf(se[0]),Integer.valueOf(se[1]))); } } Range[] rs = ranges.toArray(new Range[]{}); Arrays.sort(rs); ranges.clear(); Range cur,next; for (int i = 0; i < rs.length-1; i++) { cur = rs[i]; next = rs[i+1]; if(cur.isCombine(next)){ rs[i+1] = cur.combine(next); }else{ ranges.add(cur); } // 處理最後一個 if(i+1 == rs.length-1){ ranges.add(rs[i+1]); } } StringBuilder output = new StringBuilder(); for (Range range: ranges) { output.append(range); } System.out.println(output.substring(0,output.length()-1)); } public static void main(String[] args) { handleInput(); } }