问题:给出一个整形数组,以及数组的最大值max和最小值min,写一个函数产生一个在[min,max]范围内的随机数,该随机数并不在数组中。假设总能找到该随机数。
OC算法实现:
//
// NumInRange.h
// Algorithm
//
// Created by han shuai on 2016/9/25.
// Copyright © 2016年 han shuai. All rights reserved.
//
<p class="p1"><span class="s1">/**</span></p><p class="p1"><span class="s1"> 11</span></p><p class="p1"><span class="s1"> */</span></p>
#import <Foundation/Foundation.h>
@interface NumInRange : NSObject
- (int)numInRange:(NSArray *)dataArr;
@end
//
// NumInRange.m
// Algorithm
//
// Created by han shuai on 2016/9/25.
// Copyright © 2016年 han shuai. All rights reserved.
//
#import "NumInRange.h"
@implementation NumInRange
- (int)numInRange:(NSArray *)dataArr
{
//数组升序
dataArr = [dataArr sortedArrayUsingSelector:@selector(compare:)];
int from = [[dataArr firstObject] intValue];
int to = [[dataArr lastObject] intValue];
int random = (int)(from + (arc4random() % (to - from + 1)));
//使用二分查找降低时间复杂度
while ([self binarySearching:dataArr searchObj:[NSNumber numberWithInt:random]] >= 0) {
random = (int)(from + (arc4random() % (to - from + 1)));
}
return random;
}
- (int)binarySearching:(NSArray *)dataArr searchObj:(NSNumber *)searchObj
{
NSRange searchRange = NSMakeRange(0, [dataArr count]);
int index = (int)[dataArr indexOfObject:searchObj inSortedRange:searchRange options:NSBinarySearchingFirstEqual usingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
return [obj1 compare:obj2];
}];
return index;
}
@end