給定一個整數數組,每個元素出現三次,除了一次,它只出現一次。找到那一個。這是我現在擁有的。但是一旦我得到單個數字「b」,我不知道如何打破for循環。任何解決方案在斯卡拉請?單數2斯卡拉解決方案
for(Array(a,b) <- nums.sorted.sliding(2))
{
if (a == b){j = j+1}
else
{
if (j < 3) j =1
b
}
}
給定一個整數數組,每個元素出現三次,除了一次,它只出現一次。找到那一個。這是我現在擁有的。但是一旦我得到單個數字「b」,我不知道如何打破for循環。任何解決方案在斯卡拉請?單數2斯卡拉解決方案
for(Array(a,b) <- nums.sorted.sliding(2))
{
if (a == b){j = j+1}
else
{
if (j < 3) j =1
b
}
}
這將做到這一點。
nums.groupBy(identity).find(_._2.length == 1).get._1
這是有點不安全,因爲它會拋出,如果沒有單計數元素。如果在沒有找到單個計數元素的情況下返回默認值,則可以更安全。
nums.groupBy(identity).find(_._2.length == 1).fold(-1)(_._1)
另一種方法是通過(在基座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))
}
感謝您的解決方案,它工作得很好。只是一個問題:「身份」是什麼意思? – user3752500
'identity'是另一種說法'x => x'的方式。只寫'_'將會很好,但不能編譯。 – jwvh
謝謝你的解釋 – user3752500