Kotlin中如何简便计算数组/列表内元素两两相乘结果
实现方案
要拿到集合内不重复两两组合的乘积,根本不需要复杂操作,核心思路就是遍历所有下标满足i < j的元素对,直接计算乘积即可,天然就能得到你要的1*2、1*3、2*3这类结果,不会出现重复配对、自己乘自己的问题。
适配数组和List<Int>的简便实现
不管你手里的是整数数组,还是List<Int>类型的列表,都可以直接套下面的逻辑,以Kotlin为例(其他语言逻辑完全通用):
// 支持List<Int> fun List<Int>.getPairProducts(): List<Int> { val res = mutableListOf<Int>() for (i in 0 until lastIndex) { for (j in i+1..lastIndex) { res.add(this[i] * this[j]) } } return res } // 适配Int数组 fun IntArray.getPairProducts(): List<Int> = this.toList().getPairProducts()
调用非常简单:
fun main() { val numList = listOf(1,2,3) println(numList.getPairProducts()) // 输出 [2, 3, 6] val numArr = intArrayOf(1,2,3) println(numArr.getPairProducts()) // 输出 [2, 3, 6] }
更精简的函数式写法
如果不想写显式双层循环,用集合的函数式API一行就能搞定:
fun List<Int>.getPairProductsShort() = flatMapIndexed { i, a -> drop(i+1).map { b -> a*b } }
别用“先算所有两两乘积再去重”的笨方法,下标错位遍历的方式只需要遍历n*(n-1)/2次,是这类组合问题效率最高的遍历方式,集合元素量大的时候差距会非常明显。
如果是用Java、C#等其他语言,只要照搬「外层遍历每个下标,内层从当前下标下一位开始遍历配对」的逻辑就行,不需要额外引入第三方工具包。
内容的提问来源于stack exchange,提问作者Bob Redity
相关产品推荐
相关产品推荐

