微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在一个for循环中合并间隔

如何解决在一个for循环中合并间隔

这可能是一个奇怪的问题,但是我试图合并间隔时间,并且为在for循环之外有一行感到烦恼-我真的很想将该行(哈哈)合并到for循环中并让所有事情立即发生。

问题:例如,您获得了时间间隔(1、5),(3、7),(4、6),(6、8),(10、12),(12、15)程序应返回(1,8),(10,15),因为它们合并了所有重叠的间隔。

我的方法是,我拥有一个具有第一对值的当前值,然后运行从1到末尾的for循环,并检查我所在的对是否与我的当前值合并。如果确实合并,则更新当前对中的值,如果不合并,则将当前值添加到结果列表中,然后将其值更新到我当前所在的任何节点上。

可以随意更改代码,但需要使其完全在一个for循环中工作。 如果您发现该代码有任何其他错误,请告诉我。谢谢!

class Pair{
    public int first;
    public int second;
    
    public Pair(int x,int y){
      this.first = x;
      this.second = y; 
    }
}

class MergeIntervals{
  static ArrayList<Pair> mergeIntervals(ArrayList<Pair> v) {
  ArrayList<Pair> result = new ArrayList<Pair>();
 
  //check for size & null
  if(v == null || v.size() == 0) {
    return null;
  } 
  if(v.size() == 0) {
    result.add(v.get(0));
    return result;
  }

  Pair current = new Pair(v.get(0).first,v.get(0).second);

  for(int i = 1; i < v.size(); i++) {

    //want to merge
    if(v.get(i).first < current.second) {
      if(v.get(i).second > current.second) {
        current.second = v.get(i).second;
      }
    }
    else {
      result.add(new Pair(current.first,current.second));
      current.first = v.get(i).first;
      current.second = v.get(i).second;
    }
  }
  //loop broke before was able to merge
  result.add(new Pair(current.first,current.second));

  return result;
  }
}

解决方法

总结对现有代码的可能更改/增强:

  • 在类def clip(lo,x,hi): low = (min(lo,x) == x) high = (max(x,hi) == x) while low: return lo while high: return hi return x 中提供了一个复制构造函数,并为方便起见重写了Pair
  • 通过toString()方法增强输入数据的验证
  • 对输入数据进行排序以保证间隔的顺序
  • merge方法中使用Pair复制构造函数
merge

测试:

class Pair{
    public int first;
    public int second;
    
    public Pair(int x,int y){
        this.first = x;
        this.second = y; 
    }
    
    public Pair(Pair p) {
        this(p.first,p.second);
    }
    
    @Override
    public String toString() {
        return "(" + first + "," + second + ")";
    }
}

class MergeIntervals{
    public static List<Pair> merge(List<Pair> v) {
        if (null == v) {
            return null;
        }
        // early return an empty list or containing a single pair
        if (v.size() < 1) {
            return v;
        }
        List<Pair> result = new ArrayList<>();
        
        Collections.sort(v,(a,b) -> Integer.compare(a.first,b.first));
        
        Pair current = new Pair(v.get(0));
        
        for (int i = 1; i < v.size(); i++) {
            Pair p = v.get(i);
            if (p.first <= current.second) {
                current.second = Math.max(p.second,current.second);
            } else {
                result.add(current);
                current = new Pair(p);
            }
        }
        result.add(current);

        return result;
    }
}

输出:

List<Pair> data = Arrays.asList(
    new Pair(3,7),new Pair(1,5),new Pair(6,8),new Pair(4,6),new Pair(10,12),new Pair(12,15)
);

System.out.println(MergeIntervals.merge(data));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。