题解 | #第k小数#

第k小数

https://ac.nowcoder.com/acm/problem/207028

技巧:
    快速排序
思路:
    题目其实很简单。由于用go实现。硬是卡了半天
    坑点1: 开始用scan.Text() 由于最大程度限制一直越界
    坑点2:Readstring 一定要trim一波 !!! (T一直读不进去)
实现:
package main

import (
    "bufio"
    . "fmt"
    "io"
    "os"
    "strconv"
    "strings"
)

//Scanner在初始化的时候有设置一个maxTokenSize
//这个值默认是MaxScanTokenSize = 64 * 1024 ,
//当一行的长度大于64*1024即65536之后,就会出现ErrTooLong错误。

func findKth(arr []int, l, r, k int) int {
    L, R, i := l-1, r+1, l
    x := arr[l+(r-l)/2]
    // partition
    for i != R {
        if arr[i] < x {
            L++
            arr[i], arr[L] = arr[L], arr[i]
            i++
        } else if arr[i] > x {
            R--
            arr[i], arr[R] = arr[R], arr[i]
        } else {
            i++
        }
    }
    if k <= L {
        return findKth(arr, l, L, k)
    } else if k >= R {
        return findKth(arr, R, r, k)
    }
    return arr[k]
}

// https://ac.nowcoder.com/acm/problem/207028
func NC207028(_r io.Reader, _w io.Writer) {
    in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
    defer out.Flush()

    firstLine, _ := in.ReadString('\n')
    firstLine = strings.TrimSpace(firstLine)
    T, _ := strconv.Atoi(firstLine)
    for T > 0 {
        var n, k int
        secondStr, _ := in.ReadString('\n')
        secondStr = strings.TrimSpace(secondStr)
        secondLine := strings.Split(secondStr, " ")
        n, _ = strconv.Atoi(secondLine[0])
        k, _ = strconv.Atoi(secondLine[1])

        arr := make([]int, n)
        thirdStr, _ := in.ReadString('\n')
        thirdStr = strings.TrimSpace(thirdStr)
        thirdLine := strings.Split(thirdStr, " ")
        for i := 0; i < n; i++ {
            arr[i], _ = strconv.Atoi(thirdLine[i])
        }
        Fprintln(out, findKth(arr, 0, n-1, k-1))
        T--
    }
}

func main() {
    NC207028(os.Stdin, os.Stdout)
}


全部评论

相关推荐

05-30 12:03
山西大学 C++
offer来了我跪着接:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
05-16 11:16
已编辑
东华理工大学 Java
牛客737698141号:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
点赞 评论 收藏
分享
学java时间比较短不到三个月,基本的技术栈都过了一遍就是都不太深,有个小项目。是继续找实习还是沉淀准备秋招呢?找实习的话会花很多时间在八股,放弃的话又怕秋招简历太难看。有无大佬支招
今天java了吗:1.一定要找实习,实习不一定要去,但是找实习过程中的面试经验和心态经验才是最重要的 2.八股本来就是大头,甚至比项目重要 3.这个时间段也是面试比较多的阶段,可以抓住机会锻炼。面试才会发现自己的不足,感觉自己会了和能给面试官娓娓道来是两码事
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务