You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin面试题:基于支付记录Map统计用户高频消费类别

问题描述

给定两个Map集合,需实现函数findMostFrequentCategories,返回用户消费频率最高的类别列表:

  • mostFrequentPayees: Map<String, List<String>>:键为用户名,值是该用户付款过的收款方列表;
  • categoryOfPayees: Map<String, List<String>>:键为消费类别,值是该类别包含的收款方列表。

函数返回值为Map<String, List<String>>,其中键是用户名,值是该用户消费频率最高的类别列表。

示例输入输出

输入

mostFrequentPayees:

{
"Bob": [ "Bell Canada", "Tim Hortons", "Amazon" ],
"Alex": [ "Starbucks", "Netflix", "Tim Hortons" ]
}

categoryOfPayees:

{
"Phone": [ "Bell Canada" ],
"TV": [ "Bell Canada", "Netflix" ],
"Entertainment": [ "Bell Canada", "Netflix", "Amazon" ],
"Beverages": [ "Tim Hortons", "Starbucks" ],
"Fast Food": [ "Tim Hortons", "Starbucks" ],
}

预期输出

{
"Bob": [ "Entertainment" ],
"Alex": [ "Beverages", "Fast Food" ]
}

Kotlin实现方案

fun findMostFrequentCategories(
    mostFrequentPayees: Map<String, List<String>>,
    categoryOfPayees: Map<String, List<String>>
): Map<String, List<String>> {
    // 预构建收款方到对应类别的映射,提升后续查询效率
    val payeeToCategories = mutableMapOf<String, MutableList<String>>()
    categoryOfPayees.forEach { (category, payees) ->
        payees.forEach { payee ->
            payeeToCategories.getOrPut(payee) { mutableListOf() }.add(category)
        }
    }

    return mostFrequentPayees.mapValues { (_, payees) ->
        // 统计当前用户每个类别的出现次数
        val categoryCount = mutableMapOf<String, Int>()
        payees.forEach { payee ->
            payeeToCategories[payee]?.forEach { category ->
                categoryCount[category] = categoryCount.getOrDefault(category, 0) + 1
            }
        }

        // 找到最高频次值
        val maxCount = categoryCount.values.maxOrNull() ?: 0
        // 筛选出所有频次等于最高值的类别,排序保证结果一致性
        categoryCount.filter { it.value == maxCount }.keys.sorted()
    }
}

// 验证逻辑
fun main() {
    val mostFrequentPayees = mapOf(
        "Bob" to listOf("Bell Canada", "Tim Hortons", "Amazon"),
        "Alex" to listOf("Starbucks", "Netflix", "Tim Hortons")
    )

    val categoryOfPayees = mapOf(
        "Phone" to listOf("Bell Canada"),
        "TV" to listOf("Bell Canada", "Netflix"),
        "Entertainment" to listOf("Bell Canada", "Netflix", "Amazon"),
        "Beverages" to listOf("Tim Hortons", "Starbucks"),
        "Fast Food" to listOf("Tim Hortons", "Starbucks")
    )

    val result = findMostFrequentCategories(mostFrequentPayees, categoryOfPayees)
    println(result)
    // 输出结果:{Bob=[Entertainment], Alex=[Beverages, Fast Food]}
}

实现说明

  1. 预构建映射:遍历categoryOfPayees建立收款方到类别的关联,避免后续重复遍历类别集合,提升整体效率;
  2. 频次统计:对每个用户的收款方列表,逐个查询对应的类别并累加频次;
  3. 筛选最高频类别:找到统计后的最高频次值,筛选出所有频次等于该值的类别,返回结果。

内容的提问来源于stack exchange,提问作者Akshat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:30:50