算法练习(一)

算法在我们开发的过程中是很重要的一部分,但往往也是被我们容易忽略的一部分。提起算法,可能大多数人都很反感,记得上大学时算法课也是听的糊里糊涂。最近在看落影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 }

 

posted @ 2017-04-14 09:57  hongsheng  阅读(480)  评论(0编辑  收藏  举报