【问题标题】:Single Number 2 Scala solution单数 2 Scala 解决方案
【发布时间】:2017-08-01 21:42:34
【问题描述】:

给定一个整数数组,每个元素都会出现 3 次,但只有一个元素只出现一次。找到那个单一的。这就是我现在所拥有的。但是一旦我得到单个数字“b”,我不知道如何打破 for 循环。请问scala有什么解决方案吗?

for(Array(a,b) <- nums.sorted.sliding(2))
{
  if (a == b){j = j+1}
  else 
   {
      if (j < 3) j =1
      b
   }
}

【问题讨论】:

    标签: algorithm scala


    【解决方案1】:

    这样就可以了。

    nums.groupBy(identity).find(_._2.length == 1).get._1
    

    这有点不安全,如果没有单计数元素它会抛出。如果在没有找到单计数元素的情况下返回默认值,则可以使其更安全。

    nums.groupBy(identity).find(_._2.length == 1).fold(-1)(_._1)
    

    【讨论】:

    • 感谢您的解决方案,效果很好。只是一个问题:identity 是什么意思?
    • identityx =&gt; x 的另一种说法。最好只写 _ 但这不会编译。
    • 谢谢您的解释
    【解决方案2】:

    另一种方法是通过将基数 3 模 3 中的两个数字的数字相加来对数组求和(换句话说,基数 3 中的 XOR)。出现 3 次的元素将变为 0,因此这个和的结果将是单个数字。

    def findSingleNumber(numbers: Array[Int]) = {
      def add3(a: String, b: String): String = a.zipAll(b, '0', '0').map {
        case (i, j) => ((i.toInt + j.toInt) % 3 + '0').toChar
      }(collection.breakOut)
    
      val numbersInBase3 = numbers.map(n => Integer.toString(n, 3).reverse) 
      Integer.parseInt(numbersInBase3.fold("0")(add3).reverse, 3)
    }
    
    scala> findSingleNumber(Array(10, 20, 30, 100, 20, 100, 10, 10, 20, 100))
    res1: Int = 30
    

    或将基数为 3 的数字表示为数字数组:

    def findSingleNumber(numbers: Array[Int]) = {
      def toBase3(int: Int): Array[Int] =
        Iterator.iterate(int)(_ / 3).takeWhile(_ != 0).map(_ % 3).toArray
    
      def toBase10(arr: Array[Int]): Int =
        arr.reverseIterator.foldLeft(0)(_ * 3 + _)
    
      def add3(a: Array[Int], b: Array[Int]): Array[Int] = a.zipAll(b, 0, 0).map {
        case (i, j) => (i + j) % 3
      }
    
      toBase10(numbers.map(toBase3).fold(Array.empty[Int])(add3))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-05
      • 2013-09-04
      • 1970-01-01
      • 2021-02-03
      • 2020-04-09
      • 1970-01-01
      • 2023-04-03
      • 2016-03-12
      相关资源
      最近更新 更多