题目
写一个方法实现技术部人员随机均分成指定N组参加小组活动,要求:
随机分配
每组人员尽量均分
在满足上面要求的前提下男女数量尽量平均
男或女数量不定,可能为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);
}
}
结果
买年货的钱够了