我有一份范围清单。现在我将得到一个数字列表&我必须从范围中删除数字并创建新的范围。
所有的连续数应该在一个范围内,不连续数应该在单独的范围内。
public class DriverClass{
public static void main(String[] args){
List<Interval> intervals = new ArrayList<Interval>();
Interval i1 = new Interval(5, 9);
Interval i2 = new Interval(12, 23);
intervals.add(i1);
intervals.add(i2);
List<Integer> numbersToBeDeleted = Arrays.asList(6, 7, 19, 21);
}
}
删除6,7,19,21
预期输出:[5,5],[8,9],[12,18],[20,20],[22,23]
class Interval {
int start, end;
Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
我无法思考解决方案,任何建议都会有帮助!
2条答案
按热度按时间kyxcudwk1#
我处理过以下用例:
如果现有间隔的开始和结束与现有间隔相同,则从列表中删除该间隔。
如果要删除的间隔位于现有范围之间,那么我将现有间隔划分为2个间隔,不包括要删除的间隔&在列表中添加2个新间隔。
如果要删除的间隔位于现有间隔的边界值中,则我不会创建新的开始/结束间隔。
示例代码:
oxalkeyp2#
对于要删除的每个号码:
找到包含该数字的区间索引(如果有的话;如果没有这样的间隔,你就完了,可以考虑扔了)。
依靠:
如果要删除的数字是间隔中的唯一数字,则删除整个间隔。
否则,如果数字是间隔中的第一个或最后一个,则缩短间隔。
否则分成两段。
您可能希望以不同的方式编写条件检查代码,但这应该是基本思想。用于在列表中删除和插入间隔
List.remove(int)
以及List.add(int, E)
方法应该是有用的。快乐的编码。ps向您的应用程序添加方法可能会很方便
Interval
类来确定是否包含一个数字,它是第一个还是最后一个,并缩短前面或后面的间隔。甚至可能是一种分裂成两个区间的方法。