// 从随机数发生器中连续取出1000个数字组成的序列,求其中最长的递增序列的长度;例如取出 [1,9,5,6,8,2,4],最长的递增序列是[5,6,8],长度为3。#importint main(int argc, const char * argv[]) {
@autoreleasepool {
int length = 1; //保存递增序列的长度
int index = 0; //保存递增序列最大的数组下标
int tempLength = 1; //临时递增序列长度
//定义一个可变数组,添加1000个随机数到数组中
NSMutableArray *numbers = [NSMutableArray array];
for (int i = 0; i < 1000; i++) {
int temp = arc4random_uniform(1000) + 1;
[numbers addObject:[NSNumber numberWithInteger:temp]];
}
//遍历数组,比对数组相邻2个数字之间的大小,如果左边小于右边,则为递增序列,长度length自动+1,如果左边大于右边,那么递增序列结束,给出判断临时序列长度tempLength是否小于当前递增序列length的长度,如果小于,则将length的值赋给tempLength,再将length重置为1(因为至少有1位数字,好让继续进行下次循环时计算新的递增序列长度),继续循环直到结束,即可取出最大的递增序列长度tempLength,此递增序列的最大数组下标index。
for (int i = 0; i < numbers.count - 1; i++) {
if (numbers[i] < numbers[i+1]) {
length++;
}else{
if (tempLength < length) {
tempLength = length;
index = i;
}
length = 1;
}
}
//定义一个可变数组,从最大递增序列下标index开始,向前循环,将原始数组numbers中的元素添加到serialNumbers数组中(此处也可以正常循环,(i = index - tempLength +1; i <=index;i++)这样后面可以省略反向排序数组,定义新数组保存的操作)
NSMutableArray *serialNumbers = [NSMutableArray array];
for (NSInteger i = index; i > index - tempLength; i--) {
[serialNumbers addObject:numbers[i]];
}
//反向排序serialNumbers数组,使用newSerialNumbers数组保存
NSArray *newSerialNumbers = [[serialNumbers reverseObjectEnumerator] allObjects];
//打印newSerialNumbers数组和数组长度
NSLog(@"The serialNumbers is %@,the length is %ld",newSerialNumbers,[newSerialNumbers count]);
}
return 0;
}
这是朋友的面试题,我使用Objective-C给出的解决方案,与大家交流。
网友评论