从NSArray中找到小于给定数字的最大数字

时间:2014-08-11 07:39:42

标签: objective-c sorting search nsarray

假设我有一个整数的整数int [],我想搜索最接近的较小值到某个输入数。

例如,如果数组包含1235759120且输入为109,则输出应该是59。 我已经尝试了这个但是根本不需要它。

NSTimeInterval currentTime = self.player.currentTime;
NSInteger playerTime=currentTime;
NSUInteger index = [_timesArray indexOfObject:@(playerTime)
                                inSortedRange:NSMakeRange(0, _timesArray.count-1)
                                      options:NSBinarySearchingFirstEqual | NSBinarySearchingInsertionIndex
                              usingComparator:^(id a, id b) {
                                  return [a compare:b];
                              }];

3 个答案:

答案 0 :(得分:2)

您的代码可以按照您提供的示例数据按预期工作:

NSArray *_timesArray = @[@1, @23, @57, @59, @120];
NSTimeInterval currentTime = 109;
NSInteger playerTime=currentTime;
NSUInteger index = [_timesArray indexOfObject:@(playerTime)
                                inSortedRange:NSMakeRange(0, _timesArray.count-1)
                                      options:NSBinarySearchingFirstEqual | NSBinarySearchingInsertionIndex
                              usingComparator:^(id a, id b) {
                                  return [a compare:b];
                              }];
NSLog(@"Index: %lu", (unsigned long)index);

输出:

Index: 4

检查您的输入。可能他们不是你认为的那样。

答案 1 :(得分:1)

正如我之前所说的那样:“你已经对阵列进行了排序,你需要的是从最大数量到最小数量......这里的算法很简单!”

    NSNumber* givenNumber = @(105);
    for (NSNumber* item in [@[@(1), @(23), @(57), @(59), @(120)] reverseObjectEnumerator]){
        // go downward
        if (item.integerValue < givenNumber.integerValue)
        {
            NSLog(@"%@ < %@",item,givenNumber);
            // save this number somewhere
            break;
        }
    }

答案 2 :(得分:0)

它可以通过在O(lg n)中运行的binary_search_like算法来解决,但我不知道objective-c所以我将用c ++给出代码。

我假设给定的元素不在数组中。

int binary_search_like(int s[], int key, int low, int high)
{
    int middle; 
    if (low > high) return (s[high]); 

    middle = (low + high) / 2;

    if (s[middle] > key)
        return(binary_search_like(s, key, low, middle - 1));
    else
        return(binary_search_like(s, key, middle + 1, high));
}

int Search(int s[], int key, int size){

    if (key > s[size - 1]) return s[size - 1];
    // Check if key < smallest element , give error !

    return binary_search_like(s, key, 0, size);

 }