采访中有人问我这个问题:
如何随机排列没有两个重复项的字符数组?
我想出的算法是:
HashMap
例如:
[a,b,b,c] shuffled array with above algorithm - [a,b,c,b]; [b,b,b,c] unique < duplicate return error
但是我很确定自己使逻辑过于复杂了。有没有更简单,更简单的方法来做到这一点?
[有一个测试用例失败,如注释中指出的那样] 因此,如果参考我看到的答案,请注意相同的情况,但是如果您使用’a’-> 4,’b’-> 2,“ c”-> 1。因为第一步是“ abc”,所以保留’a’->3’b’-> 1。但是有一个答案:“ ababaca”。– user3386109
案例1:构建基本算法
使用哈希表(键是字符,其出现是值)来计算出现次数。这将为我们提供存储桶,例如,如果我们拥有“ cbaaba”,则将为3个存储桶提供值分别为1的’c’,’值为3的’a’和值为2的’b’。
根据出现次数对存储桶进行排序,其中出现次数最多的元素排在最前面。所以现在我们有了
‘a’-> 3,’b’-> 2,’c’-> 1
结果数组将从以排序方式从3个存储桶中各取一个开始。
“ abc”,现在我们的存储桶为’a’-> 2,’b’-> 1和’c’-> 0
接下来,我们再次尝试从已排序的存储桶中获取每个元素(忽略具有0个元素的存储桶)
现在,“ abcab”的存储桶状态变为:’a’-> 1,’b’-> 0和’c’-> 0
接下来,如上所述,我们继续得到结果
=>“ abcaba”。
情况2:如果字符串类似于“ aaaabbbcccdd”
我们将有水桶作为
'a'--> 4 'b'--> 3 'c'--> 3 'd'--> 2
这里有 b和c的 桶,它们的 大小相同 。 每当发生这种情况时,我们都必须执行 JoinBuckets 的 _ 操作_ ,它将在单个存储桶中连接“ b”和“ c”,而“ bc”将被视为单个元素。
现在我们的水桶将
'a'--> 4 'bc'--> 3 'd'--> 2
现在以与案例1相同的方式进行操作,我们尝试构建结果
=>结果=“ abcd”
'a'--> 3 'bc'--> 2 'd'--> 1
=>结果=“ abcdabcd”
'a'--> 2 'bc'--> 1 'd'--> 0
=>结果=“ abcdabcdabc”
'a'--> 1 'bc'--> 0 'd'--> 0
= >最终结果=“ abcdabcdabca”