• 合并区间问题


    问题描述

    为了提高文章质量,每一篇文章(假设全部都是英文)都会有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

    方式一:

      暴力解法,用了三层嵌套的循环。

      第一层循环三行数据,

      第二层循环每行数据的每个begin和end;(前两步可以先把二维的数据改成一个list或者map,就可以减少一层循环),

      第三层循环已经排好顺序的结果集。把每个新的begin和end与结果集对比,合并到合适的位置。

    缺点:判断条件很多,很多边界可能会考虑不周全。

    第71行的判断条件内,会把begin 大于 结果集当前遍历的begin 的新区间向前合并,然后放到下次循环继续判断是否会向后合并。然后下次循环向keys链表中插入数据时,需要判断key是否已经存在。

      1 package test;
      2 
      3 import java.util.HashMap;
      4 import java.util.LinkedList;
      5 import java.util.Map;
      6 import java.util.Scanner;
      7 
      8 public class TestFind {
      9     public static void main(String[] args) {
     10         Scanner sc = new Scanner(System.in);
     11         int num = Integer.parseInt(sc.nextLine());
     12         System.out.println(num);
     13         String[] lines = new String[num];
     14         for (int i = 0; i < num; i++) {
     15             lines[i] = sc.nextLine();
     16         }
     17         
     18         LinkedList<Integer> keys = new LinkedList<>();
     19         LinkedList<Integer> keys2 = new LinkedList<>();
     20         Map<Integer, Integer> m = new HashMap<>();
     21         //遍历人数
     22         for (int i = 0; i < num; i++) {
     23             //遍历每个人的数据
     24             boolean isInsert = false;
     25             for (String it : lines[i].split(";")) {
     26                 int begin = Integer.parseInt(it.split(",")[0]);
     27                 int end = Integer.parseInt(it.split(",")[1]);
     28                 //比较key值,然后确定value
     29                 for (int j = 0; j < keys.size(); j++) {
     30                     Integer key = keys.get(j);
     31                     Integer value = m.get(key);
     32                     if (begin < key) {
     33                         if (end < key) {
     34                             m.put(begin, end);
     35                             if (keys.contains(begin)){
     36                                 keys2.set(j-1,begin);
     37                             }else{
     38                                 keys2.add(j, begin);
     39                             }
     40                             isInsert = true;
     41                         } else if (end >= key && end <= value) {
     42                             m.remove(key);
     43                             m.put(begin, value);
     44                             keys2.remove(j);
     45                             //2 10 17
     46                             if (keys.contains(begin)){
     47                                 keys2.set(j-1,begin);
     48                             }else{
     49                                 keys2.add(j, begin);
     50                             }
     51                             isInsert = true;
     52                         } else {
     53                             m.remove(key);
     54                             m.put(begin, end);
     55                             keys2.remove(j);
     56                             if (keys.contains(begin)){
     57                                 keys2.set(j-1,begin);
     58                             }else{
     59                                 keys2.add(j, begin);
     60                             }
     61                             isInsert = true;
     62                         }
     63                     } else if (begin == key) {
     64                         int max = Math.max(end, value);
     65                         m.put(begin, max);
     66                         isInsert = true;
     67                     } else {
     68                         if (begin <= value+1) {
     69                             if (end <= value) {
     70                                 continue;
     71                             } else if (end > value) {
     72                                 //把key作为begin,查看下次循环是否被合并,若是最后一个,不影响
     73                                 m.put(key, end);
     74                                 begin = key;
     75                                 continue;
     76                             }
     77                         } else {
     78                             continue;
     79                         }
     80                     }
     81                         break;
     82                 }
     83                 if (!isInsert) {
     84                     m.put(begin, end);
     85                     if (!keys.contains(begin)){
     86                         keys2.add(begin);
     87                     }
     88                 }
     89                 isInsert =false;
     90                 keys = (LinkedList<Integer>) keys2.clone();
     91                 System.out.println(keys);
     92             }
     93         }
     94         StringBuilder sb = new StringBuilder();
     95         for (int i = 0; i < keys.size(); i++) {
     96             int key = keys.get(i);
     97             int value = m.get(key);
     98             sb.append(key+","+value+";");
     99         }
    100         sb.delete(sb.length()-1,sb.length()-1);
    101         System.out.println(keys);
    102         System.out.println(sb);
    103     }
    104     
    105 }

    方式二

    待补全

  • 相关阅读:
    window7 上创建定时任务来运行自动化脚本
    初试接口测试
    list tuple dict (列表,元祖,字典间的相互转换)
    防止忘记的一些博客
    [python] 常用正则表达式爬取网页信息及分析HTML标签总结
    python正则表达式提取字符串
    关于json的dump和dumps
    三月23日测试Fiddler
    第六章 部署Python开发的web业务
    第五节 Nginx集群
  • 原文地址:https://www.cnblogs.com/liumaowu/p/10528981.html
Copyright © 2020-2023  润新知