【问题标题】:counting pairs in a list计算列表中的对
【发布时间】:2021-01-19 13:22:50
【问题描述】:

我最近开始使用 HackerRank,并且正在尝试“按匹配销售”。在利用 Kotlin 的函数编程能力方面,我已经找到了一个我很满意的解决方案。但是,我没有得到预期的答案...

问题总结:

给定一个数组: -> 查找并返回对的总数。

即:

输入 -> [10, 20, 20, 10, 10, 30, 50, 10, 20]

对数 -> 3


这是我的代码和一些解释它的 cmets:

fun sockMerchant(n: Int, pile: Array<Int>): Int{
    var count = 0
    mutableMapOf<Int, Int>().withDefault { 0 }.apply {
        // the [attempted] logic behind this piece of code here is 
        // that as we iterate through the list, the 'getOrPut()'
        // function will return either the value for the given [key]             
        // or throw an exception if there is no such key
        // in the map. However, since our map was created by 
        // [withDefault], the function resorts to its `defaultValue` <-> 0
        // instead of throwing an exception.
        for (e in values) {
            // this simplifies our code and inserts a zero [+1] where needed.
            // if (key exists)
            //      // return its associated value and MOD it:
            //      case: even  -> increment counter
            //            else  -> do nothing
            // else if (key dne)
            //      // insert default value <-> [0] + 1
            //              ....
            //              ....
            //              ....
            if (getOrPut(e, { getValue(e) + 1 } ) % 2 == 0) count++
        }
    }
    return count
}


fun main(args: Array<String>) {
    val scan = Scanner(System.`in`)
    val n = scan.nextLine().trim().toInt()
    val ar = scan.nextLine().split(" ").map{ it.trim().toInt() }.toTypedArray()
    val result = sockMerchant(n, ar)
    println(result)
}

-- 任何帮助或提示都会在这里大有帮助:)

【问题讨论】:

  • n 变量是什么意思?
  • 此外,您的示例输入中似乎只有两对。一对的定义是什么?
  • @AdamMillerchip - 我看到三对:(10, 10)、(10, 10) 和 (20, 20)。
  • @AdamMillerchip 列表的大小
  • @Todd 取决于对的定义,这就是我问的原因。但既然 OP 喜欢你的回答,我想你是对的。

标签: algorithm kotlin mutablemap


【解决方案1】:

我可以通过将数字组合在一起,获取结果列表,并对每个数字包含多少对求和来做到这一点:

fun sockMerchant(n: Int, pile: Array<Int>): Int =
    pile.groupBy { it }.values.sumBy { it.size / 2 }

在我们做pile.groupBy { it }之后,我们就有了这样的结构:

{10=[10, 10, 10, 10], 20=[20, 20, 20], 30=[30], 50=[50]}

我们取值,然后将它们的每个大小除以 2 相加。这会将半对向下舍入为 0,将完整对各舍入为 1。

注意:我并不完全清楚n 在这种情况下的目的是什么。

【讨论】:

    【解决方案2】:

    我对其进行了一些修改以更容易测试,但这里是修复:

    import java.util.*
    
    fun sockMerchant(n: Int, pile: Array<Int>): Int{
        var count = 0
        mutableMapOf<Int, Int>().withDefault { 0 }.apply {
            // the [attempted] logic behind this piece of code here is
            // that as we iterate through the list, the 'getOrPut()'
            // function will return either the value for the given [key]
            // or throw an exception if there is no such key
            // in the map. However, since our map was created by
            // [withDefault], the function resorts to its `defaultValue` <-> 0
            // instead of throwing an exception.
            for (e in pile) {
                // this simplifies our code and inserts a zero [+1] where needed.
                // if (key exists)
                //      // return its associated value and MOD it:
                //      case: even  -> increment counter
                //            else  -> do nothing
                // else if (key dne)
                //      // insert default value <-> [0] + 1
                //              ....
                //              ....
                //              ....
                println(e)
                put(e, getValue(e) + 1)
                if (getValue(e) % 2 == 0) count++
                println(entries)
            }
        }
        return count
    }
    
    
    val n = 5
    val ar = "10 10 10 10 20 20 30 40".split(" ").map{ it.trim().toInt() }.toTypedArray()
    val result = sockMerchant(n, ar)
    println(result)
    

    输出:

    10
    [10=1]
    10
    [10=2]
    10
    [10=3]
    10
    [10=4]
    20
    [10=4, 20=1]
    20
    [10=4, 20=2]
    30
    [10=4, 20=2, 30=1]
    40
    [10=4, 20=2, 30=1, 40=1]
    3
    Pair.kts:3:18: warning: parameter 'n' is never used
    fun sockMerchant(n: Int, pile: Array<Int>): Int{
                     ^
    
    Process finished with exit code 0
    

    解释:

    • 您循环了“值”,它一开始是空的,所以您从未对您的代码做任何事情
    • 即使在循环 pile 时,您的递增逻辑也不会超过 1,因此条件永远不会满足并且计数永远不会增加。

    但背后的主要原因是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 2017-08-03
      相关资源
      最近更新 更多