假设我有一个带有“startNo”整数和“endNo”整数的“数字”对象数组。
数组中可能有多个“数字”,我想获得一个带有修改对象的新数组,这些数组只有没有重叠的范围。
例如:如果数组有:
number
( startNo:1 endNo:3)
( startNo:1 endNo:7)
( startNo:2 endNo:9)
( startNo:15 endNo:18)
( startNo:50 endNo:60)
( startNo:55 endNo:65)
我想得到一个这样的数组:
number
( startNo:1 endNo:9)
( startNo:15 endNo:18)
( startNo:50 endNo:65)
我一直在尝试使用结构,fors和其他所有方法,但我得到的只是多层次的混乱。
如果有帮助,我正在开发Objective-C平台
要添加:startPage可以是一个大数字,endPage可以是一个小数字。
答案 0 :(得分:2)
这是一个经典的算法课程问题。
按第一个(最小)值的降序对数组进行排序。 跟踪两个变量:起始段,结束段。
每个回合选择一个数组并检查开始和结束数字,并确定它是否 是否在细分市场。
这样就可以找到重叠
祝你好运
答案 1 :(得分:2)
假设你的班级是MyNumbers,就像这样:
@interface MyNumbers : NSObject
@property NSInteger startNumber;
@property NSInteger endNumber;
- (id)initWithStartNumber:(NSInteger)start withEnd:(NSInteger)end;
@end
合并方式:
- (void)yourMethod{
MyNumbers *obj1=[[MyNumbers alloc]initWithStartNumber:1 withEnd:3];
MyNumbers *obj2=[[MyNumbers alloc]initWithStartNumber:1 withEnd:7];
MyNumbers *obj3=[[MyNumbers alloc]initWithStartNumber:2 withEnd:9];
MyNumbers *obj4=[[MyNumbers alloc]initWithStartNumber:15 withEnd:18];
MyNumbers *obj5=[[MyNumbers alloc]initWithStartNumber:50 withEnd:60];
MyNumbers *obj6=[[MyNumbers alloc]initWithStartNumber:55 withEnd:65];
NSArray *array=@[obj1,obj2,obj3,obj4,obj5,obj6];
NSMutableArray *mergedArray=[NSMutableArray arrayWithObject:array[0]];
for (NSInteger index=1; index<array.count; index++) {
MyNumbers *currentNumber=array[index];
MyNumbers *previousNumber=array[index-1];
if (currentNumber.startNumber<=previousNumber.endNumber) {
previousNumber.endNumber=currentNumber.endNumber;
[mergedArray replaceObjectAtIndex:mergedArray.count-1 withObject:previousNumber];
}
else{
[mergedArray addObject:currentNumber];
}
}
for(MyNumbers *element in mergedArray){
NSLog(@"startNo:%d endNo:%d",element.startNumber, element.endNumber);
}
}
输出:
2013-03-14 17:14:05.040 Inheritance[34234:303] startNo:1 endNo:9 2013-03-14 17:14:05.041 Inheritance[34234:303] startNo:15 endNo:18 2013-03-14 17:14:05.041 Inheritance[34234:303] startNo:50 endNo:65
答案 2 :(得分:1)
解决此问题的简单方法:
答案 3 :(得分:1)
快速的想法未经测试:
1.获取最小的起始编号说sn和相应的结尾没有说en。
2.如果开始no小于sn,则继续检查下一个对象然后忽略开始号。如果结束号大于en,则将新的结束号存储到en。
3.这会给你你的对象。
4.如果起始编号大于en,则创建一个要添加到数组中的新对象。
这应该有效。如果你有其他问题,请告诉我
答案 4 :(得分:0)
//用C#语言编写。但概念可以用任何编程语言实现。
public class Range
{
public int startNo { get; set; }
public int stopNo { get; set; }
public Range(int start, int stop)
{
startNo = start;
stopNo = stop;
}
}
public void GetUniqueRanges()
{
var rangeList = new List<Range>();
rangeList.Add(new Range(7,4));
rangeList.Add(new Range(3, 15));
rangeList.Add(new Range(54, 35));
rangeList.Add(new Range(45, 60));
rangeList.Add(new Range(60,75));
rangeList.Add(new Range(76,100));
rangeList.Add(new Range(6,10));
rangeList.Add(new Range(16,24));
rangeList.Add(new Range(19,34));
var sorted = new List<Range>();
foreach (var range in rangeList)
{
var item = new Range(Math.Min(range.startNo, range.stopNo), Math.Max(range.startNo, range.stopNo));
sorted.Add(item);
}
var result = new List<Range>();
sorted = sorted.OrderBy(x => x.startNo).ToList();
var counter = sorted.Count;
for (var i = 0; i < counter; )
{
var item = new Range (sorted[i].startNo, sorted[i].stopNo );
var j = i + 1;
for (; j < counter; j++)
{
if (sorted[j].startNo <= item.stopNo)
{
item.stopNo =Math.Max(item.stopNo, sorted[j].stopNo);
}
else
{
break;
}
}
i = j;
result.Add(item);
}
}