题目:
公司有n个组,每组人数相同,>=1人,需要进行随机的组队吃饭。
要求:1. 两两一队,不能落单,落单则三人一队
2. 一个人只出现一次
3. 队伍中至少包含两个组
4. 随机组队,重复执行程序得到的结果不一样
举例:
GroupList = [ # 小组列表
['小名', '小红', '小马', '小丽', '小强'],
['大壮', '大力', '大1', '大2', '大3'],
['阿花', '阿朵', '阿蓝', '阿紫', '阿红'],
['A', 'B', 'C', 'D', 'E'],
['一', '二', '三', '四', '五'],
['建国', '建军', '建民', '建超', '建跃'],
['爱民', '爱军', '爱国', '爱辉', '爱月']
]
输入:GroupList
输出:(A, 小名),(B, 小红)。。。
解题思路:
刚看到这道题,肯定需要用随机去做:
1、首先随机从二维list选择一个list,从选择的一个list 中随机选择一个元素。
2、两两一对,而且不能是同一组,要记住上一个的list的key,也就是 last_index
3、循环的结束呢,是所有的元素都取出来了,用bit_index 记录空list个数
4、把满足条件的元素记录到result 中
代码实现:
var GroupList = [][]string{
{"小名", "小红", "小马", "小丽", "小强"},
{"大壮", "大力", "大1", "大2", "大3"},
{"A", "B", "C", "D", "E"},
{"建国", "建军", "建民", "建超", "建跃"},
{"一", "二", "三", "四", "五"},
}
func funcGroupList() [][]string {
result := [][]string{[]string{}}
bit_index := 0
grouplist_y := len(GroupList)
grouplist_x := len(GroupList[0])
last_index := -1
r := rand.New(rand.NewSource(time.Now().UnixNano()))
for bit_index < grouplist_y {
rand_y := r.Intn(grouplist_y)
if last_index == rand_y {
continue
}
rand_x := r.Intn(grouplist_x)
if len(GroupList[rand_y]) == 0 || len(GroupList[rand_y]) <= rand_x {
continue
}
val := GroupList[rand_y][rand_x]
GroupList[rand_y] = append(GroupList[rand_y][:rand_x], GroupList[rand_y][rand_x+1:]...)
result[len(result)-1] = append(result[len(result)-1], val)
last_index = rand_y
if len(result[len(result)-1]) >= 2 {
last_index = -1
result = append(result, []string{})
}
if len(GroupList[rand_y]) == 0 {
bit_index++
}
}
if len(result[len(result)-1]) == 1 {
temp := result[len(result)-1]
result = result[:len(result)-1]
result[len(result)-1] = append(result[len(result)-1], temp...)
}
if len(result[len(result)-1]) == 0 {
return result[:len(result)-1]
}
return result
}