计算列表中的对

问题描述

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

问题摘要

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

即:

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

对数 -> 3


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

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

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

解决方法

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

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

完成pile.groupBy { it }之后,我们将具有以下结构:

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

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

注意:在这种情况下,我还不太清楚n的目的是什么。

,

我对其进行了一些修改,使其更易于测试,但这是修复方法:

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,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,因此条件从未满足且计数也从未增加。

但是背后的主要理由是正确的。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...