数组的最大出现次数的和

问:给定一个整形数组,如何找出数组中重复次数最多的数的和?

方法一:

- (NSInteger)findNumberWithSum:(NSArray *)dataArray {
    if (dataArray.count <= 0) {
        return 0;
    }
    NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:dataArray.count];//临时数组,存放出现次数
    NSInteger value = 0;//出现次数
    NSInteger maxNum = 0;//出现次数最多的值
    for (NSInteger i = 0; i < dataArray.count; i++) {
        tempArray[i] = @0;//把所有临时数组值设置为0
    }
    for (NSInteger i = 0; i < tempArray.count; i++) {
        for (NSInteger j = 0; j < tempArray.count; j++) {
            if ([dataArray[i] intValue] == [dataArray[j] intValue]) {
                //如果相等把临时数组值取出来,并且+1,然后替换
                NSInteger index = [[tempArray objectAtIndex:i] integerValue];
                NSNumber *obj = [NSNumber numberWithInteger:index+1];
                //替换这两个方法都可以
                [tempArray replaceObjectAtIndex:i withObject:obj];
                //                tempArray[i] = obj;
            }
        }
    }
    
    //遍历临时数组
    for (NSInteger i = 0; i < tempArray.count; i++) {
        if ([tempArray[i] intValue] > value) {
            value = [tempArray[i] integerValue];
        }
    }
    for (NSInteger i = 0; i < tempArray.count; i++) {
        if (value == [tempArray[i] integerValue]) {
            if (maxNum < [dataArray[i] integerValue]) {
                maxNum = [[dataArray objectAtIndex:i] integerValue];
            }
        }
    }
    NSLog(@"最大的出现次数是:%lu",value);
    NSLog(@"出现次数最多的最大数字是:%lu",maxNum);
    return value*maxNum;
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSArray *arr = @[@1,@3,@3,@4,@3,@0,@8,@3,@3,@2,@8,@5,@4,@5,@9];//原数组
    NSInteger sum = [self findNumberWithSum:arr];
    NSLog(@"最大重复次数的和是:%lu",sum);
}

方法二:

- (NSInteger)findWithMap:(NSArray *)dataArray {
    NSInteger value = 0;//出现次数
    NSInteger maxNum = 0;//出现次数最多的值
    NSMutableDictionary *temp = [[NSMutableDictionary alloc] initWithObjects:dataArray forKeys:dataArray];
    for (NSInteger i = 0; i < temp.allKeys.count; i++) {
        [temp setValue:@0 forKey:[temp.allKeys objectAtIndex:i]];
    }
    for (NSInteger i = 0; i < dataArray.count; i++) {
        if (i < temp.allValues.count) {
            for (NSInteger j = 0; j < dataArray.count; j++) {
                if ([dataArray[i] intValue] == [dataArray[j] intValue]) {
                    //如果相等把临时数组值取出来,并且+1,然后替换
                    NSNumber *oldValue = [temp.allValues objectAtIndex:i];
                    NSNumber *newValue = [NSNumber numberWithInteger:[oldValue integerValue]+1];
                    [temp setValue:newValue forKey:[temp.allKeys objectAtIndex:i]];
                }
            }
        }
        
    }
    for (NSInteger i = 0; i < temp.allValues.count; i++) {
        if ([temp.allValues[i] intValue] > value) {
            value = [temp.allValues[i] integerValue];
        }
    }
    for (NSInteger i = 0; i < dataArray.count; i++) {
        if (i < temp.allValues.count) {
            if (value == [temp.allValues[i] integerValue]) {
                if (maxNum < [dataArray[i] integerValue]) {
                    maxNum = [[dataArray objectAtIndex:i] integerValue];
                }
            }
        }
    }
    NSLog(@"字典去重数据:%@",temp);
    NSLog(@"最大的出现次数是:%lu",value);
    NSLog(@"出现次数最多的最大数字是:%lu",maxNum);
    return value*maxNum;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSArray *arr = @[@1,@3,@3,@4,@3,@10,@8,@3,@3,@2,@8,@5,@4,@5,@9];//原数组
    NSInteger sum = [self findWithMap:arr];
    NSLog(@"最大重复次数的和是:%lu",sum);
}

测试结果:

2020-07-21 23:05:36.673809+0800 gather[34330:1028997] 字典去重数据:{
    9 = 1;
    5 = 5;
    3 = 5;
    1 = 2;
    10 = 5;
    8 = 1;
    4 = 2;
    2 = 5;
}
2020-07-21 23:05:36.673957+0800 gather[34330:1028997] 最大的出现次数是:5
2020-07-21 23:05:36.674041+0800 gather[34330:1028997] 出现次数最多的最大数字是:3
2020-07-21 23:05:36.674251+0800 gather[34330:1028997] 最大重复次数的和是:15

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值