算法练习(一)
算法在我们开发的过程中是很重要的一部分,但往往也是被我们容易忽略的一部分。提起算法,可能大多数人都很反感,记得上大学时算法课也是听的糊里糊涂。最近在看落影loyinglin大神的博客,觉得一些算法很有意思,就也试着用OC撸了一遍。
A:题目大意:N(N为偶数)个数字,把数字平分 N/2 组,使得每组的数字和相等。
先说说我的思路吧,刚开始看到这里有点迷,不过很快就有思路了。首先可以求得数组中数字的总和,还可以求得每个分组的和,然后根据每个数字的差,就很容易能分组了。ok,很快撸了一遍,但是发现有了错误,平分后求得的平均数有小数。一想,发现N不但要为偶数,总和还要能整除,改正后又运行了一遍,结果还是不对,有时三个数相加才等于平均数。于是又把数组改正了一下,这会终于完美求得结果了。我使用的数字分别是:26、24、8、6、2、30。
下面是完整代码:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@26, @24, @8, @6, @2, @30, nil]; NSInteger count = 0; for (NSNumber *number in array) { count += [number integerValue]; } NSInteger averageNum = count/(array.count/2); NSMutableArray *arrCount = [NSMutableArray array]; NSMutableArray *arrays = [NSMutableArray array]; for (int i = 0; i < array.count; i++) { if (![arrays containsObject:array[i]]) { NSMutableArray *arrs = [NSMutableArray array]; NSInteger poorNum = averageNum - [array[i] integerValue]; [arrs addObject:array[i]]; [arrays addObject:@(poorNum)]; for (NSNumber *num in array) { if ([num intValue] == poorNum) { [arrs addObject:num]; } } [arrCount addObject:arrs]; } } NSLog(@"arrCount is %@", arrCount);
改进:其实看到题目后,我首先想到的是我们很早就熟悉的求1到100的和,首位依次相加,两数的和都相等。上面的代码撸完后,我看了一下数字,排序后,首位依次相加,和也正好相等,而且操作起来更加容易。完整代码如下:
1 NSMutableArray *array = [NSMutableArray arrayWithObjects:@26, @24, @8, @6, @2, @30, nil]; 2 for (int i = 0; i < array.count - 1; i++) { 3 for (int j = i + 1; j < array.count; j++) { 4 if ([array[i] integerValue] > [array[j] integerValue]) { 5 NSInteger temp = [array[i] integerValue]; 6 array[i] = array[j]; 7 array[j] = [NSNumber numberWithInteger:temp]; 8 } 9 } 10 } 11 NSLog(@"%@", array); 12 NSMutableArray *arras = [NSMutableArray array]; 13 for (int i = 0; i < array.count/2; i++) { 14 NSMutableArray *arr01 = [NSMutableArray array]; 15 [arr01 addObject:array[i]]; 16 [arr01 addObject:array[array.count - 1 - i]]; 17 [arras addObject:arr01]; 18 } 19 NSLog(@" arras is %@", arras);
B:题目大意:N个字符串,找到最短的区间,包含所有字符串出现过的字符,输出区间长度。
思路:刚开始看到题目感觉很容易,分别求每个字符串中字符在字母表中的下标,计算区间分分钟的事。但当我撸代码的时候犯难了,没求下标的方法,难道要把26个英文字母一个个放入数组中比较?想了想,我还是放弃了。忽然想起来,每隔字符其实在ASCII中是有对应的数字了,赶紧找了一下方法,完美实现了题目要求。
1 - (void)method02{ 2 NSMutableArray *arrStrs = [NSMutableArray arrayWithObjects:@"abc", @"def", @"ss", @"ff", nil]; 3 4 NSMutableArray *baseArr = [NSMutableArray array]; 5 for (NSString *str in arrStrs) { 6 NSMutableArray *arrs = [NSMutableArray array]; 7 for (int i = 0; i < str.length; i++) { 8 char c = [str characterAtIndex:i]; 9 NSString *sc = [NSString stringWithFormat:@"%c", c]; 10 NSInteger ascIICode = [sc characterAtIndex:0]; 11 [arrs addObject:@(ascIICode)]; 12 13 } 14 [self rank:arrs block:^(NSNumber *a, NSNumber *b) { 15 [baseArr addObject:a]; 16 [baseArr addObject:b]; 17 }]; 18 } 19 20 [self rank:baseArr block:^(NSNumber *a, NSNumber *b) { 21 NSString *starStr = [NSString stringWithFormat:@"%c", [a integerValue]]; 22 NSString *endStr = [NSString stringWithFormat:@"%c", [b integerValue]]; 23 NSLog(@"输出区间为%@...%@", starStr, endStr); 24 }]; 25 26 27 } 28 - (void)rank:(NSMutableArray *)array block:(resultBlock)block{ 29 for (int i = 0; i < array.count - 1; i++) { 30 for (int j = i + 1; j < array.count; j++) { 31 if ([array[i] integerValue] > [array[j] integerValue]) { 32 NSNumber *temp = array[i]; 33 array[i] = array[j]; 34 array[j] = temp; 35 } 36 } 37 } 38 39 block(array[0], array[array.count - 1]); 40 }