题目:
给你一个字符串数组 nums 和一个整数 k 。nums 中的每个字符串都表示一个不含前导零的整数。
返回 nums 中表示第 k 大整数的字符串。
注意: 重复的数字在统计时会视为不同元素考虑。例如,如果 nums 是 ["1","2","2"],那么 "2" 是最大的整数,"2" 是第二大的整数,"1" 是第三大的整数。
算法:
注意partition什么时候交换。
nums[j] >nums[right]的时候,和i交换
func kthLargestNumber(nums []string, k int) string {
left, right := 0, len(nums) - 1
pivot := partition(nums, left, right)
for pivot + 1 != k {
if pivot + 1 < k {
left = pivot + 1
pivot = partition(nums, left, right)
} else {
right = pivot - 1
pivot = partition(nums, left, right)
}
}
return nums[pivot]
}
func partition(nums []string, left, right int) int {
if left == right {
return left
}
random(nums, left, right)
i := left
for j := i; j < right; j ++ {
// 降序
if len(nums[j]) > len(nums[right]) || len(nums[j]) == len(nums[right]) && nums[j] > nums[right] {
nums[j], nums[i] = nums[i], nums[j]
i ++
}
}
nums[right], nums[i] = nums[i], nums[right]
return i
}
func random(nums []string, left, right int) {
// fmt.Println(right, left)
randn := rand.Intn(right - left) + left
nums[randn], nums[right] = nums[right], nums[randn]
}