问题描述
这可能是一个奇怪的问题,但是我试图合并间隔时间,并且为在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));