Я пытаюсь решить проблему на HackerRank. Я пытаюсь решить эту проблему более функциональным способом (используя неизменность). Я попытался решить, но я не полностью уверен в этом.
Вот ссылка на проблему:
Мое изменяемое решение выглядит следующим образом:
/**
* Mutable solution
* MSet => mutable set is used
* val pairs => it is delclared var and getting reassigned
*/
import scala.annotation.tailrec
import scala.collection.mutable.{Set => MSet}
def sockMerchant2(n: Int, ar: Array[Int]): Int = {
val sockInventory : MSet[Int] = MSet.empty[Int]
var pairs = 0
ar.foreach { elem =>
if(sockInventory.contains(elem)) {
pairs = pairs + 1
sockInventory -= elem
} else sockInventory += elem
}
pairs
}
sockMerchant(5, Array(1,2,1,2,4,2,2))
Неизменная версия того же решения:
/**
* Solution with tail recursion.
* Immutable Set is used. No variable is getting reassigned
* How it is getting handled internally ?
* In each iteration new states are assigned to same variables.
* @param n
* @param ar
* @return
*/
import scala.annotation.tailrec
def sockMerchant(n: Int, ar: Array[Int]): Int = {
@tailrec
def loop(arr: Array[Int], counter: Int, sockInventory: Set[Int]): Int ={
if(arr.isEmpty) counter
else if(sockInventory.contains(arr.head))
loop(arr.tail, counter +1, sockInventory-arr.head)
else loop(arr.tail, counter, sockInventory + arr.head)
}
loop(ar, 0, Set.empty)
}
sockMerchant(5, Array(1,2,1,2,4,2,2))
Каков идеальный способ решить эту проблему, учитывая принципы функционального программирования?
identity
означает группировать ваши элементы по их значениям. Другими словами, еслиa == b
, то они будут сгруппированы вместе. Подпись типа Array#groupBy —groupBy[K](f: (T) => K): Map[K,Array[T]]
. Посколькуar
равноArray[Int]
, тоgroupBy(identity)
возвращаетMap[Int, Array[Int]]
. - person jwvh   schedule 15.07.2019