技术部年会编程题

题目

写一个方法实现技术部人员随机均分成指定N组参加小组活动,要求:

  1. 随机分配

  2. 每组人员尽量均分

  3. 在满足上面要求的前提下男女数量尽量平均

  4. 男或女数量不定,可能为0

思路

将所有人分为男女两组,N个组命名为1组、2组、3组...N组。

将男生一个一个依次放到1组、2组、3组...N组,若人数大于N,则继续从1组依次放,放完为止。

将女生一个一个依次放到N组、N-1组、N-2组...1组,若人数大于N,则继续从N组依次放,放完为止。

代码

  • 定义Person类:
@interface Person : NSObject

/** 是否是男人 */
@property (nonatomic, assign) BOOL isMan;

@end
  • 定义Group类:
@interface Group : NSObject

/** 小组成员 */
@property (nonatomic, strong) NSMutableArray <Person *> *members;

@end
  • 方法:
/**
 分组

 @param allMembers 所有成员
 @param groupNum 分成几组
 @return 分好的group数组
 */
- (NSArray <Group *> *)groupingWithAllMembers:(NSArray <Person *> *)allMembers groupNum:(NSInteger)groupNum {
    
    if (!allMembers || allMembers.count == 0 || groupNum <= 0) {
        NSLog(@"别闹");
        return nil;
    }
    
    // 男生数组
    NSMutableArray *manArray = [NSMutableArray array];
    // 女生数组
    NSMutableArray *womanArray = [NSMutableArray array];
    
    for (Person *person in allMembers) {
        if (person.isMan) {
            // 随机插入男生数组
            [manArray insertObject:person atIndex:(manArray.count == 0 ? 0 : arc4random() % manArray.count)];
        } else {
            // 随机插入女生数组
            [womanArray insertObject:person atIndex:(womanArray.count == 0 ? 0 : arc4random() % womanArray.count)];
        }
    }
    
    // 创建N个组
    NSMutableArray *groupArray = [NSMutableArray array];
    for (int i = 0; i < groupNum; i++) {
        Group *group = [[Group alloc] init];
        [groupArray addObject:group];
    }
    
    // 将男生依次放入
    for (int i = 0; i < manArray.count; i++) {
        Group *group = groupArray[i % groupNum];
        [group.members addObject:manArray[i]];
    }
    
    // 将女生反方向依次放入
    for (int i = 0; i < womanArray.count; i++) {
        Group *group = groupArray[groupNum - (i % groupNum) - 1];
        [group.members addObject:womanArray[i]];
    }
    
    return groupArray;
}
  • 写个方法验证一下:
/**
 测试

 @param personNum 人数
 @param groupNum 组数
 */
- (void)checkWithPersonNum:(NSInteger)personNum groupNum:(NSInteger)groupNum {
    // 创建一个person数组
    NSMutableArray *personArray = [NSMutableArray array];
    
    NSInteger boyTotalNum = 0;
    NSInteger girlTotalNum = 0;
    
    for (int i = 0; i < personNum; i++) {
        Person *person = [[Person alloc] init];
        // 性别随机
        person.isMan = arc4random() % 2;
        [personArray addObject:person];
        if (person.isMan) {
            boyTotalNum ++;
        } else {
            girlTotalNum ++;
        }
    }
    
    NSLog(@"总人数:%ld", personArray.count);
    NSLog(@"男生总人数:%ld", boyTotalNum);
    NSLog(@"女生总人数:%ld", girlTotalNum);
    NSLog(@"分%ld组", groupNum);
    
    // 验证方法
    NSArray *groupArray = [self groupingWithAllMembers:personArray groupNum:groupNum];
    
    for (int i = 0; i < groupArray.count; i++) {
        Group *group = groupArray[i];
        NSInteger boyNum = 0;
        NSInteger girlNum = 0;
        for (Person *person in group.members) {
            if (person.isMan) {
                boyNum ++;
            } else {
                girlNum ++;
            }
        }
        NSLog(@"第%d组,共%ld人,男生%ld人,女生%ld人", i+1, boyNum+girlNum, boyNum, girlNum);
    }
}
1692043-c76ca65c0851c61f.png

结果

买年货的钱够了

1692043-09a2ce7b1ad7cfed.jpeg

1692043-d5eef460e9be5df4.jpg
1692043-757cd024fc3c145b.jpg

猜你喜欢

转载自blog.csdn.net/weixin_34407348/article/details/87342647
今日推荐