1

假设我有一个带有“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)

我一直在尝试使用 structs、fors 和所有东西来尝试不同的方法,但我得到的只是多层次的混淆。

如果有帮助,我正在开发 Objective-C 平台

补充:startPage 可以是大数,endPage 可以是小数。

4

5 回答 5

2

这是一个经典的算法课程问题..

按第一个(最小)值的降序对数组进行排序。跟踪两个变量:开始段,结束段。

每轮选择一个数组并检查开始和结束数字,并确定它是否在段中。

这样可以找到重叠

祝你好运

于 2013-03-14T10:02:12.897 回答
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 继承[34234:303] startNo:1 endNo:9
2013-03-14 17:14:05.041 继承[34234:303] startNo:15 endNo:18
2013-03-14 17:14:05.041 继承[34234:303] startNo:50 endNo:65
于 2013-03-14T11:41:23.577 回答
1

解决此问题的简单方法:

  1. 创建一个新的空数组(我们将其命名为:tmp)。
  2. 将第一个数组的startNoendNo 放入tmp。
  3. 取第二个数组的startNoendNo。然后,决定它们是否与 tmp 中的重叠。(如果它们不重叠,请将它们都插入到 tmp 的末尾。)
  4. 对每个数组重复这些步骤。
  5. tmp 现在将保存所有范围,没有重叠。
于 2013-03-14T10:12:30.243 回答
1

只是快速的想法未经测试:

1.获取最小的起始编号say sn和对应的end no say en。

2.如果 start no 小于 sn 则继续检查下一个对象,然后忽略 start no 。如果结束编号大于 en 则将新的结束编号存储到您的 en 中。

3.这会给你你的对象。

4.如果起始编号大于en,则创建一个新对象添加到数组中。

这应该可以。如果您还有其他问题,请告诉我

于 2013-03-14T10:12:34.760 回答
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);
        }
    }
于 2013-03-14T14:06:23.850 回答