算法排序题

题目:

公司有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
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值