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]} }
实现说明
- 预构建映射:遍历
categoryOfPayees建立收款方到类别的关联,避免后续重复遍历类别集合,提升整体效率; - 频次统计:对每个用户的收款方列表,逐个查询对应的类别并累加频次;
- 筛选最高频类别:找到统计后的最高频次值,筛选出所有频次等于该值的类别,返回结果。
内容的提问来源于stack exchange,提问作者Akshat
相关产品推荐
相关产品推荐

