2017-08-01 42 views
1

給定一個整數數組,每個元素出現三次,除了一次,它只出現一次。找到那一個。這是我現在擁有的。但是一旦我得到單個數字「b」,我不知道如何打破for循環。任何解決方案在斯卡拉請?單數2斯卡拉解決方案

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

回答

3

這將做到這一點。

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

這是有點不安全,因爲它會拋出,如果沒有單計數元素。如果在沒有找到單個計數元素的情況下返回默認值,則可以更安全。

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

感謝您的解決方案,它工作得很好。只是一個問題:「身份」是什麼意思? – user3752500

+0

'identity'是另一種說法'x => x'的方式。只寫'_'將會很好,但不能編譯。 – jwvh

+0

謝謝你的解釋 – user3752500

0

另一種方法是通過(在基座3換言之XOR)中底座3模3兩數相加的數字求和陣列。出現3次的元素將變爲零,所以這個和的結果將是單個數字。

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)) 
}