在NSArray中找到NSNumbers的中值,可以使用以下方法:
[array valueForKeyPath:@"@median.self"];
NSMethodSignature *signature = [array methodSignatureForSelector:@selector(median)];
NSInteger median = [signature median];
@implementation NSNumber (Median)
- (double)median {
NSUInteger count = [self count];
if (count == 0) {
return 0;
}
NSUInteger middle = count / 2;
NSUInteger lower = 0;
NSUInteger upper = count - 1;
while (lower < upper) {
NSUInteger mid = (lower + upper) / 2;
NSUInteger countMid = [self countBetween:lower and:mid];
NSUInteger countHigher = [self countBetween:mid and:upper];
if (countMid < countHigher) {
lower = mid + 1;
} else {
upper = mid;
}
}
return (double)lower + (double)count / 2;
}
@end
NSNumber *medianNumber = [array median];
double median = [medianNumber doubleValue];
以上方法中,方法1和方法2可以快速找到中值,但需要遍历数组,时间复杂度为O(n)。方法3可以实现较高效的中值计算,时间复杂度为O(1),但需要实现一个方法。方法4是直接使用NSNumber的实例方法获取中值,简单高效,但需要先遍历数组获取NSNumber对象。
领取专属 10元无门槛券
手把手带您无忧上云