分享一道面试题

278 阅读2分钟

题目

题目一:公司有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] [四 建超 爱辉]

解题思路

解题思路.jpg 描述: 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  
        }  
    }  
}