逻辑 - 需要找到重叠的数字范围

时间:2013-03-14 09:55:32

标签: iphone ios cocoa-touch cocoa logic

假设我有一个带有“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可以是一个小数字。

5 个答案:

答案 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)

解决此问题的简单方法:

  1. 创建一个新的空数组(让我们将它命名为:tmp)。
  2. 将第一个数组的 startNo endNo 放入tmp。
  3. 选择第二个阵列的 startNo endNo 。然后,决定它们是否与tmp中的那些重叠。 (如果它们没有重叠,请在tmp的末尾插入它们。)
  4. 为每个阵列重复这些步骤。
  5. tmp现在将保持所有范围,没有重叠。

答案 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);
        }
    }