如何对包含重复项的数组进行洗牌,但重复项不能背靠背

How to shuffle an array with duplicate items, but duplicates can't be back to back

给定一个数组 [1, 2, 2, 3, 4, 4, 5],是否可以打乱数组同时防止重复项彼此相邻?

例如:

这道题看似简单,但仔细想想,解法似乎很复杂。非常感谢任何帮助,谢谢!!

如果你不在意算法的执行时间,只要shuffle几次,直到得到你想要的结果

let arr = [1, 2, 2, 3, 4, 4, 5];

const hasDublicateItems = (arr) => arr.some((v, i, a) => v === a[i+1]);

while (hasDublicateItems(arr)) 
  arr = arr.sort(() => (Math.random() > .5) ? 1 : -1);

console.log(arr);
.as-console-wrapper{min-height: 100%!important; top: 0}