【发布时间】:2019-11-25 16:57:12
【问题描述】:
我需要对从 API 接收到的对象数组进行洗牌。该数组将具有相同的重复对象。
有效输入:
- ["a","a","a","a","b","b","b","b","c","c","c","c "]
- ["a", "a", "b", "b"] 或 ["b", "b", "a", "a"]
输入无效:
- ["a","a","a","a","b","c"]
- [“a”、“b”、“a”、“b”]
洗牌后:
- i 和 i + 1 处的对象应该不同
- 每次对数组进行洗牌时,都应该生成一个新的有效解
有效输出:
- b,a,c,b,a,c,a,c,b,a,c,b
- c,a,b,a,b,c,a,c,b,a,b,c
- c,b,a,c,b,a,c,b,a,c,b,a
无效输出:
- c,c,a,b,b,a,c,b,a,c,b,a
我开始使用 Fisher-Yates 进行初始洗牌,然后验证解决方案是否有效。 一旦我有一个小集合,这种蛮力方法就起作用了,但随着输入的增长它变得无用。 有没有一种有效的方法来生成随机排列而不会使重复项彼此相邻?
Efficient algorithm for ordering different types of objects 提供了有关如何使同类对象彼此远离的见解,不幸的是,如果我再次尝试随机播放,我会遇到相同的解决方案/模式。
https://stackoverflow.com/a/32366585/4271233 生成满足“没有两个相邻的重复项”的所有可能排列,但遗憾的是我需要生成所有排列然后随机选择一个
【问题讨论】:
-
你尝试了什么?
-
你需要一个洗牌的数组,我需要一个问题。除了请解决这个问题 :) How to Ask
-
@luk2302,我正在使用 Fisher–Yates,然后验证解决方案是否有效。一旦我有一个小集合,这种蛮力方法就可以工作,但是随着输入的增长它变得无用
标签: java arrays algorithm shuffle