题目
题目一:公司有n个组,>=5,每组人数相同,>=2人,需要进行随机的组队吃饭。
要求:
1. 两两一队或三人一队,不能落单
2. 两人队、三人队各自的队伍数均不得少于2
3. 一个人只出现一次
4. 队伍中所有人不能来自相同组
5. 随机组队,重复执行程序得到的结果不一样,总队伍数也不能一样
6. 注释注释注释
注:要同时满足条件1-6,
举例:
GroupList = [ # 小组列表 ['小名', '小红', '小马', '小丽', '小强'],
['大壮', '大力', '大1', '大2', '大3'],
['阿花', '阿朵', '阿蓝', '阿紫', '阿红'],
['A', 'B', 'C', 'D', 'E'],
['一', '二', '三', '四', '五'],
['建国', '建军', '建民', '建超', '建跃'],
['爱民', '爱军', '爱国', '爱辉', '爱月']
]
输入:GroupList
示例输出: [小强 大3] [阿红 E] [五 建跃] [爱月 小名] [大壮 阿花] [A 一] [建国 爱民] [小红 大力] [阿朵 B] [二 建军] [爱军 小马] [大1 阿蓝] [C 三] [建民 爱国 小丽] [大2 阿紫 D] [四 建超 爱辉]
解题思路
描述:
1、把二维数组按照列拆分为一维数组(2-3个元素为一个小数组,可满足条件4)
2、计算数组里元素个数,根据个数列出算式3x+2y=25,x和y分别是要拆的3元素数组和2元素数组个数。
3、如果x是随机选取的,且x>=2 && y>=2 那么刚好满足条件(1、2、3、5)
写个能跑通的代码
package main
import (
"log"
"math/rand"
"time"
)
func main() {
//二维数组
groupList := [][]string{
{"小名", "小红", "小马", "小丽", "小强"},
{"大壮", "大力", "大1", "大2", "大3"},
{"阿花", "阿朵", "阿蓝", "阿紫", "阿红"},
{"A", "B", "C", "D", "E"},
{"一", "二", "三", "四", "五"},
{"建国", "建党", "建民", "建超", "建跃"},
{"爱民", "爱军", "爱国", "爱辉", "爱月"},
}
group := flatten(groupList)
res := getGroups(group)
log.Println(res)
}
// 分组算法
func getGroups(groupList []string) [][]string {
var res [][]string
x, y := getGroupNums(groupList)
//分x个3人组
for i := 0; i < x; i++ {
newx, old := slice3(groupList)
res = append(res, newx)
groupList = old
}
//分y个2人组
for i := 0; i < y; i++ {
tmp := groupList
newx, old := slice2(tmp)
res = append(res, newx)
groupList = old
}
return res
}
// 将切片前3个元素放到一个新的切片中并返回移除元素后的切片
func slice3(s []string) (newx, old []string) {
newx = s[0:3]
old = s[3:]
return
}
// 将切片前2个元素放到一个新的切片中并返回移除元素后的切片
func slice2(s []string) (newx, old []string) {
newx = s[0:2]
old = s[2:]
return
}
// 二维数组按照列的维度转为一维数组
func flatten(arr [][]string) []string {
numRows := len(arr)
numCols := len(arr[0])
result := make([]string, numRows*numCols)
index := 0
for j := 0; j < numCols; j++ {
for i := 0; i < numRows; i++ {
result[index] = arr[i][j]
index++
}
}
return result
}
// 根据人数分成小的数组
func getGroupNums(arr []string) (x, y int) {
total := len(arr)
rand.Seed(time.Now().UnixNano())
for {
x := rand.Intn(total/3) + 2
y := (total - x*3) / 2
if x*3+y*2 == total && y > 1 {
return x, y
}
}
}