• 算法练习(一)


    算法在我们开发的过程中是很重要的一部分,但往往也是被我们容易忽略的一部分。提起算法,可能大多数人都很反感,记得上大学时算法课也是听的糊里糊涂。最近在看落影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 }
  • 相关阅读:
    今天一个人跑了趟香山
    周六钻胡同
    (转)C#中protected用法详解
    C# base和this
    error BK1506 : cannot open file '.\Debug\ex73View.sbr': No such file or directory
    error PRJ0003 : Error spawning 'cmd.exe'
    VS2008卸载时遇到“加载安装组件时遇到问题,取消安装” 在卸载或者升级VS2008的时候,遇到“加载安装组件时遇到问题,取消安装”的情况
    我们在建立Win32工程的时候,要选择是Win32控制台应用程序还是Win32项目,那么两者到底有什么区别呢?
    开发板重新烧写时出现ERROR: Checksum failure (expected=0x3D67E6F computed=0x3E0E0CA)
    把PC上的代码移植到WINCE上
  • 原文地址:https://www.cnblogs.com/whongs/p/6707380.html
Copyright © 2020-2023  润新知