leetcode1985. 找出数组中的第 K 大整数

给你一个字符串数组 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表示所有字符串连起来的总长度。

于是,开始写代码。第一次提交:

扫描二维码关注公众号,回复: 16374582 查看本文章
class Solution {
    fun kthLargestNumber(nums: Array<String>, k: Int): String {
       val temp:Array<Int> = 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<String>, k: Int): String {
        /*
       val temp:Array<Int> = 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<String>, k: Int): String {
        /*
       val temp:Array<Int> = 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<String>, k: Int): String {
        /*
       val temp:Array<Int> = 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<i2 -> -1 
           i1>i2 -> 1 
           else -> 0 
        }
        })
        return sortedArr[nums.size-k].toString()
    }
}

既然comparator要返回Int型,那么比较的话,只有三种情况,都返回就行了。终于通过了!

时间1328 ms

击败

N/A

内存69.8 MB

击败

N/A

猜你喜欢

转载自blog.csdn.net/weixin_41579872/article/details/130970942