问:给定一个整形数组,如何找出数组中重复次数最多的数的和?
方法一:
- (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