使用kotlin解决这个问题:2418. 按身高排序 提示 简单 83 相关企业 给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 示例 1: 输入:names = ["Mary","John","Emma"], heights = [180,165,170] 输出:["Mary","Emma","John"] 解释:Mary 最高,接着是 Emma 和 John 。 示例 2: 输入:names = ["Alice","Bob","Bob"], heights = [155,185,150] 输出:["Bob","Alice","Bob"] 解释:第一个 Bob 最高,然后是 Alice 和第二个 Bob 。 提示: n == names.length == heights.length 1 <= n <= 103 1 <= names[i].length <= 20 1 <= heights[i] <= 105 names[i] 由大小写英文字母组成 heights 中的所有值互不相同
时间: 2024-01-30 11:02:25 浏览: 91
可以使用 Kotlin 的 zip() 函数将两个数组合并为一个 Pair 类型的数组。然后按照 heights 数组的降序排序,最后再将排序后的 names 提取出来即可。
代码示例:
```kotlin
fun sortNamesByHeight(names: Array<String>, heights: IntArray): Array<String> {
val pairs = names.zip(heights) // 合并为 Pair 类型的数组
pairs.sortByDescending { it.second } // 按照身高降序排序
return pairs.map { it.first }.toTypedArray() // 提取排序后的 names
}
```
使用示例:
```kotlin
val names = arrayOf("Mary", "John", "Emma")
val heights = intArrayOf(180, 165, 170)
val sortedNames = sortNamesByHeight(names, heights)
println(sortedNames.contentToString()) // 输出 ["Mary", "Emma", "John"]
```
相关问题
使用kotlin解决这个问题:1487. 保证文件名唯一 提示 中等 131 相关企业 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹:在第 i 分钟,新建名为 names[i] 的文件夹。 由于两个文件 不能 共享相同的文件名,因此如果新建文件夹使用的文件名已经被占用,系统会以 (k) 的形式为新文件夹的文件名添加后缀,其中 k 是能保证文件名唯一的 最小正整数 。 返回长度为 n 的字符串数组,其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。
以下是使用 Kotlin 解决该问题的代码:
```kotlin
fun getUniqueNames(names: Array<String>): Array<String> {
val map = mutableMapOf<String, Int>()
val result = Array(names.size) { "" }
for (i in 0 until names.size) {
val name = names[i]
if (map.containsKey(name)) {
val count = map[name]!! + 1
var uniqueName = "$name($count)"
while (map.containsKey(uniqueName)) {
uniqueName = "$name(${++count})"
}
map[name] = count
result[i] = uniqueName
map[uniqueName] = 0
} else {
result[i] = name
map[name] = 0
}
}
return result
}
```
该函数接受一个字符串数组 `names`,返回一个与 `names` 相同长度的字符串数组 `result`,其中 `result[i]` 是第 `i` 个文件夹实际名称。该函数使用一个 `map` 来记录文件名出现的次数,并根据需要添加后缀来保证文件名唯一。
具体实现是,遍历 `names` 数组,对于每个文件名,如果在 `map` 中已经存在,说明需要添加后缀,就取出该文件名出现的次数,加一后作为后缀。如果该后缀也已经存在,就继续加一,直到找到一个不存在的后缀为止。然后将文件名和后缀更新到 `map` 中,将实际名称更新到 `result` 中。如果文件名在 `map` 中不存在,说明可以直接使用,将其更新到 `map` 和 `result` 中即可。
使用kotlin完成这个题目:2559. 统计范围内的元音字符串数 提示 中等 30 相关企业 给你一个下标从 0 开始的字符串数组 words 以及一个二维整数数组 queries 。 每个查询 queries[i] = [li, ri] 会要求我们统计在 words 中下标在 li 到 ri 范围内(包含 这两个值)并且以元音开头和结尾的字符串的数目。 返回一个整数数组,其中数组的第 i 个元素对应第 i 个查询的答案。 注意:元音字母是 'a'、'e'、'i'、'o' 和 'u' 。
以下是使用 Kotlin 实现的代码:
```
class Solution {
fun countVowelStrings(words: Array<String>, queries: Array<IntArray>): IntArray {
val result = IntArray(queries.size)
val n = words.size
val dp = Array(n + 1) { IntArray(6) }
for (j in 1..5) {
dp[0][j] = 1
}
for (i in 1..n) {
for (j in 1..5) {
dp[i][j] = dp[i][j - 1] + dp[i - 1][j]
}
}
for (i in queries.indices) {
val l = queries[i][0]
val r = queries[i][1]
result[i] = dp[r - l + 1][5] - dp[l - 1][5]
}
return result
}
}
```
解题思路:
该题可以使用组合数学的思想来解决。我们可以将每个字符串看成由五个元音字母组成的序列,然后将序列中的字母分为开头、结尾和中间三部分。对于每个查询,我们可以通过计算组合数的方法来计算出以元音字母开头和结尾的字符串个数,具体公式如下:
$$C_{5}^{2+l-1} \times C_{5}^{2+r-1-l}$$
其中 $l$ 为区间左端点,$r$ 为区间右端点。具体实现见代码注释。
阅读全文