美文网首页
数组累加

数组累加

作者: 大刘 | 来源:发表于2022-10-17 17:24 被阅读0次
    
    #import <Foundation/Foundation.h>
    #import "NSArray+GGGraphics.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            /**
             * 二维数组累加, 正数和正数累加, 负数和负数累加
             * 正数:
             * @[@1, @1, @1]    @[@1, @1, @1]
             * @[@1, @1, @1] -> @[@2, @2, @2]
             * @[@1, @1, @1]    @[@3, @3, @3]
             * 负数:
             * @[@-1, @-1, @-1]      @[@-1, @-1, @-1]
             * @[@1,  @1,  @1]    -> @[@1, @1, @1]
             * @[@1,  @1,  @1]       @[@2, @2, @2]
             */
            NSMutableArray *array = [NSMutableArray arrayWithCapacity:3];
            [array addObject:@[@1, @1, @1]];
            [array addObject:@[@1, @1, @1]];
            [array addObject:@[@1, @1, @1]];
            [array print];
            NSArray *array2 = [array aryPNAddUp];
            [array2 print];
        }
        return 0;
    }
    
    
    @interface NSArray (GGGraphics)
    
    - (NSMutableArray <NSArray <NSNumber *> *> *)aryPNAddUp;
    - (NSMutableArray <NSArray <NSNumber *> *> *)aryAddUp;
    - (void)print;
    
    @end
    
    #import "NSArray+GGGraphics.h"
    
    @implementation NSArray (GGGraphics)
    
    /**
     * 二维数组累加, 正数和正数累加, 负数和负数累加
     * 正数:
     * @[@1, @1, @1]    @[@1, @1, @1]
     * @[@1, @1, @1] -> @[@2, @2, @2]
     * @[@1, @1, @1]    @[@3, @3, @3]
     * 负数:
     * @[@-1, @-1, @-1]      @[@-1, @-1, @-1]
     * @[@1,  @1,  @1]    -> @[@1, @1, @1]
     * @[@1,  @1,  @1]       @[@2, @2, @2]
     */
    - (NSMutableArray <NSArray <NSNumber *> *> *)aryPNAddUp
    {
        NSMutableArray *aryAddData = [NSMutableArray array];
        
        [aryAddData addObject:self.firstObject];
        
        // 循环遍历累加数组
        // 每遍历一次, 就往aryAddData中添加一个累加后的小数组
        for (NSInteger i = 1; i < self.count; i++) {
            
            NSArray *ary_c = self[i]; // 当前小数组, 比如: @[@1, @1, @1]
            NSArray *ary_b = aryAddData.lastObject; // 上一个小数组
            NSMutableArray *aryAddBefor = [NSMutableArray array]; // 累加后的小数组
            
            // 累加数组累加数字以当前数组长度为准
            for (NSInteger j = 0; j < ary_c.count; j++) { //遍历当前小数组
                
                CGFloat c = [ary_c[j] floatValue];      // current 当前的数字
                
                // 前一个数组如果越界, 则前一个数字为当前数字的相反数(保证循环继续)
                // -c 只是用来占位, 正负不相加
                CGFloat b = j >= ary_b.count ? -c : [ary_b[j] floatValue]; //上一个小数组对应索引j的值
                
                NSInteger f = aryAddData.count - 1;     // find 位置
                
                // 数值同方向才可以相加
                while ((b * c) < 0) {   // before 和 current 数字正负为同方向跳出循环
                    
                    if (f < 0) {    // find 小于0为找到头
                        
                        b = 0;
                    }
                    else {
                        
                        NSArray *ary_f_b = aryAddData[f];
                        
                        b = j < ary_f_b.count ? [[aryAddData[f] objectAtIndex:j] floatValue] : -c;
                    }
                    
                    f--;    // 非同方向向前寻找 ??? TODO://DALIU
                }
                
                // 将2数值之和叠加放入本次循环数组
                [aryAddBefor addObject:@(c + b)];
            }
            
            [aryAddData addObject:[NSArray arrayWithArray:aryAddBefor]];
        }
        
        return aryAddData;
    }
    
    /**
     * 二维数组累加, 正数和正数累加, 负数和负数累加
     * 正数:
     * @[@1, @1, @1]    @[@1, @1, @1]
     * @[@1, @1, @1] -> @[@2, @2, @2]
     * @[@1, @1, @1]    @[@3, @3, @3]
     * 负数:
     * @[@-1, @-1, @-1]      @[@-1, @-1, @-1]
     * @[@1,  @1,  @1]    -> @[@0, @0, @0]
     * @[@1,  @1,  @1]       @[@1, @1, @1]
     */
    - (NSMutableArray <NSArray <NSNumber *> *> *)aryAddUp
    {
        NSMutableArray *aryAddData = [NSMutableArray array];
        
        [aryAddData addObject:self.firstObject];
        
        // 循环遍历累加数组
        for (NSInteger i = 1; i < self.count; i++) {
            
            NSArray *ary_c = self[i];
            NSArray *ary_b = aryAddData.lastObject;
            NSMutableArray *aryAddBefor = [NSMutableArray array];
            
            // 累加数组累加数字已当前数组长度为准
            for (NSInteger j = 0; j < ary_c.count; j++) {
                
                CGFloat c = [ary_c[j] floatValue];      // current 当前的数字
                CGFloat b = j >= ary_b.count ? 0 : [ary_b[j] floatValue];     // 临时
                
                // 将2数值之和叠加放入本次循环数组
                [aryAddBefor addObject:@(c + b)];
            }
            
            [aryAddData addObject:[NSArray arrayWithArray:aryAddBefor]];
        }
        
        return aryAddData;
    }
    
    - (void)print {
        for (int i = 0; i < self.count; i++) {
            NSArray *subArr = [self objectAtIndex:i];
            for (NSNumber *num in subArr) {
                printf("%8lf\t", num.floatValue);
            }
            printf("\n");
        }
        printf("----------------------\n");
    }
    
    @end
    

    相关文章

      网友评论

          本文标题:数组累加

          本文链接:https://www.haomeiwen.com/subject/bqsdzrtx.html