一尘不染

如何随机排列没有两个重复项的字符数组?

algorithm

采访中有人问我这个问题:

如何随机排列没有两个重复项的字符数组?

我想出的算法是:

  1. 具有一个HashMapCharacter,字符对出现的次数。有了这个,找到重复元素与唯一元素的计数。
  2. 如果重复>唯一,则无法形成没有2个重复元素并排的混洗数组(?)
  3. 如果唯一> =重复,则有2个堆栈-1个包含唯一字符,一个包含重复字符。以这样的方式构造结果数组:首先从唯一堆栈中弹出一个元素,然后从重复堆栈中弹出一个元素。重复

例如:

[a,b,b,c] shuffled array with above algorithm - [a,b,c,b];

[b,b,b,c] unique < duplicate return error

但是我很确定自己使逻辑过于复杂了。有没有更简单,更简单的方法来做到这一点?


阅读 212

收藏
2020-07-28

共1个答案

一尘不染

[有一个测试用例失败,如注释中指出的那样]
因此,如果参考我看到的答案,请注意相同的情况,但是如果您使用’a’-> 4,’b’-> 2,“ c”-> 1。因为第一步是“ abc”,所以保留’a’->3’b’-> 1。但是有一个答案:“ ababaca”。– user3386109

案例1:构建基本算法

  1. 使用哈希表(键是字符,其出现是值)来计算出现次数。这将为我们提供存储桶,例如,如果我们拥有“ cbaaba”,则将为3个存储桶提供值分别为1的’c’,’值为3的’a’和值为2的’b’。

  2. 根据出现次数对存储桶进行排序,其中出现次数最多的元素排在最前面。所以现在我们有了

‘a’-> 3,’b’-> 2,’c’-> 1

  1. 从最大出现次数存储区中获取元素,在地图中将其计数减少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”

2020-07-28