给你一个字符串数组 nums
和一个整数 k
。nums
中的每个字符串都表示一个不含前导零的整数。
返回 nums
中表示第 k
大整数的字符串。
注意:重复的数字在统计时会视为不同元素考虑。例如,如果 nums
是 ["1","2","2"]
,那么 "2"
是最大的整数,"2"
是第二大的整数,"1"
是第三大的整数。
示例 1:
输入:nums = ["3","6","7","10"], k = 4 输出:"3" 解释: nums 中的数字按非递减顺序排列为 ["3","6","7","10"] 其中第 4 大整数是 "3"
示例 2:
输入:nums = ["2","21","12","1"], k = 3 输出:"2" 解释: nums 中的数字按非递减顺序排列为 ["1","2","12","21"] 其中第 3 大整数是 "2"
示例 3:
输入:nums = ["0","0"], k = 2 输出:"0" 解释: nums 中的数字按非递减顺序排列为 ["0","0"] 其中第 2 大整数是 "0"
提示:
1 <= k <= nums.length <= 104
1 <= nums[i].length <= 100
nums[i]
仅由数字组成nums[i]
不含任何前导零题解:当看到这个题目的时候,第一反应是将字符串转为整数,然后按照整数的大小进行排序,然后返回第K大的数字转为字符串结果就行了。 这个复杂度应该是O(nlgn)+O(M),其中n表示nums的长度,M表示所有字符串连起来的总长度。
于是,开始写代码。第一次提交:
class Solution {
fun kthLargestNumber(nums: Array, k: Int): String {
val temp:Array = Array(nums.size){0}
for(i in 0 until nums.size){
temp[i]=nums[i].toInt()
}
temp.sort()
return temp[nums.size-k].toString()
}
}
很开心,没想到中等难度的题目这么简单。然后,执行出错!!Line 5: Exception in thread "main" java.lang.NumberFormatException: For input string: "6888794705"
哦哦,原来是超越整数的界限了。那么再来,我这次用Double数据类型。
class Solution {
fun kthLargestNumber(nums: Array, k: Int): String {
/*
val temp:Array = Array(nums.size){0}
for(i in 0 until nums.size){
temp[i]=nums[i].toInt()
}
*/
//nums.sort(){c->c.toInt()}
//return nums[nums.size-k].toString()
val sortedArr = nums.sortedWith(Comparator { s1, s2 ->
val i1 = s1.toDouble()
val i2 = s2.toDouble()
(i1 - i2).toInt() // Comparator 这个比较器默认返回的是Int类型,所以这里强制转换
})
return sortedArr[nums.size-k].toString()
}
}
当输入倒数第二个测试用例的时候,也是一个数字有这么长的时候9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
又报错了!!
又超过限制了,于是又想到了一个办法,使用BigInteger类:
class Solution {
fun kthLargestNumber(nums: Array, k: Int): String {
/*
val temp:Array = Array(nums.size){0}
for(i in 0 until nums.size){
temp[i]=nums[i].toInt()
}
*/
//nums.sort(){c->c.toInt()}
//return nums[nums.size-k].toString()
val sortedArr = nums.sortedWith(Comparator { s1, s2 ->
val i1 = s1.toBigInteger()
val i2 = s2.toBigInteger()
(i1 - i2).toInt()
})
return sortedArr[nums.size-k].toString()
}
}
以为解决的是,但是toInt这个地方又越界了。。郁闷了一会之后,继续又想到了when这个单词:
class Solution {
fun kthLargestNumber(nums: Array, k: Int): String {
/*
val temp:Array = Array(nums.size){0}
for(i in 0 until nums.size){
temp[i]=nums[i].toInt()
}
*/
//nums.sort(){c->c.toInt()}
//return nums[nums.size-k].toString()
val sortedArr = nums.sortedWith(Comparator { s1, s2 ->
val i1 = s1.toBigInteger()
val i2 = s2.toBigInteger()
when{
i1 -1
i1>i2 -> 1
else -> 0
}
})
return sortedArr[nums.size-k].toString()
}
}
既然comparator要返回Int型,那么比较的话,只有三种情况,都返回就行了。终于通过了!
时间1328 ms
击败
N/A
内存69.8 MB
击败
N/A