如何将没有两个重复项的字符数组混合在一起?

时间:2016-05-05 00:06:29

标签: java arrays algorithm duplicates shuffle

我在接受采访时被问到这个问题:

  

如何将没有两个重复项的字符数组混合在一起?

我提出的算法是:

  1. 具有HashMap字符,字符对的出现次数。 通过此查找重复与唯一元素的计数。
  2. 如果重复>独一无二,无法形成一个没有2的洗牌阵列 重复元素彼此相邻(?)
  3. 如果唯一> =重复,则有2个堆栈 - 1个包含唯一 字符和包含重复字符的字符。构建 生成数组的方式是从唯一堆栈中弹出一个元素 首先,然后从重复堆栈中弹出一个元素。重复
  4. 例如:

    [a,b,b,c] shuffled array with above algorithm - [a,b,c,b];
    
    [b,b,b,c] unique < duplicate return error
    

    但我很确定我的逻辑过于复杂。有没有更容易和万无一失的方法来做到这一点?

4 个答案:

答案 0 :(得分:4)

案例1:构建基本算法

  1. 使用散列图(键是字符,其出现是值)来计算出现次数。这将给我们提供桶,就像我们有“cbaaba”将给3个桶'c'值1,'a'值3和'b'值2。

  2. 根据具有最多占优势的元素的出现对存储桶进行排序。 现在我们有了

  3. 'a' - &gt; 3,'b' - &gt; 2,'c' - &gt; 1

    1. 从max occurrence桶中获取元素,在map中将其数量减少1并将其放入结果数组中。根据已排序的出现桶,对随后的出现桶执行此操作。
    2. 结果数组将从排序方式从3个桶中取出一个开始。

      “abc”,现在我们将我们的桶称为'a' - &gt; 2,'b' - &gt; 1和'c' - &gt; 0

      接下来我们再次尝试从排序桶中获取elemet(忽略带有0个元素的桶)

      现在我们的桶状态变为:'a' - &gt; 1,'b' - &gt; 0和'c' - &gt; 0

      接下来我们继续将结果作为

      =&GT; “abcaba”。

      案例2:如果字符串类似于“aaaabbbcccdd”

      我们将有桶作为

      'a'--> 4
      'b'--> 3
      'c'--> 3
      'd'--> 2
      

      这里我们有一桶 b和c具有相同的尺寸当出现这种情况时,我们必须执行JoinBuckets的操作 ,它会在单个桶中加入'b'和'c','bc'将被视为单个元素。

      现在我们的桶将是

      'a'--> 4
      'bc'--> 3
      'd'--> 2
      

      现在以与案例1相同的方式继续前进,我们尝试构建结果

      =&gt; result =“abcd”

      'a'--> 3
      'bc'--> 2
      'd'--> 1
      

      =&gt; result =“abcdabcd”

      'a'--> 2
      'bc'--> 1
      'd'--> 0
      

      =&gt; result =“abcdabcdabc”

      'a'--> 1
      'bc'--> 0
      'd'--> 0
      

      =&gt;最终结果=“abcdabcdabca”

答案 1 :(得分:1)

我将从一个非常简单的算法开始:

background-color: rgba(0, 0, 0, 0);

这样,你有一些工作代码,当它变得太慢时,你可以在以后优化它。

  • 这个算法对于混乱 $savedDevices = [ 'phone' =>'yes', 'tablet' => 'yes', 'iphone' => 'no' ] <label> Phone :<input type="checkbox" {{($savedDevices->phone == "yes") ? "checked":"" }} name="phone"> Tablet :<input type="checkbox" {{($savedDevices->tablet == "yes") ? "checked":"" }} name="tablet"> Iphone :<input type="checkbox" {{($savedDevices->iphone == "yes") ? "checked":"" }} name="iphone"> </label> 来说非常慢,这很糟糕。
  • 它以相同的概率生成每个可能的输出,这很好。

答案 2 :(得分:0)

这实际上是一个排序问题。它让我想起“巅峰发现”,但反过来说,你想在某种意义上“创造出独特物品的顶峰”。

(2)的逻辑也有点偏。如果我有N个重复的字母,我仍然可以没有与另一个字母的N-2相似的邻居:

'aaabb' -sort-> 'ababa'

这也证明了寻找“独特”的问题,因为你很可能只有在数组中某处复制的字母。

伪:

foreach letter in string{
  if next != self then happy, move to next

  if next == self, 
     loop until spot != self and swap

可能有一种更好的分而治之的方法可以在更好的时间内通过它,但如果没有实际测试它我不确定。

答案 3 :(得分:-1)

SCALA代码。复制并粘贴此程序并运行。

def rearrange(xs : List[Char]) : List[Char] ={
xs match {
    case Nil => Nil
    case x :: xs1 => xs1 match {
    case Nil => x :: Nil
    case y :: ys1 =>
         if (x == y)  { 
              (x :: rearrange(ys1)) :+ y 
         }
         else
             x :: y :: rearrange(ys1)
         }
     }
}                                               
rearrange: (xs: List[Char])List[Char]

rearrange("hello".toList)