题解 | #最差是第几名(二)#

https://www.nowcoder.com/practice/165d88474d434597bcd2af8bf72b24f1

看了那么多大神解法,对于我这种算法弱智来说真跟不上,分享一个最傻瓜式,最易懂的方法吧。
题目要求找出中位数:总数基数输出1个,总数偶数输出2个
思路:延用上一题的题解,找到每个grade的最后一名的排名,观察这个最差排名是否包含中位数,包含则输出。
步骤:
1.查询每个grade的最差排名(同上一题)

with t0 as(
    select grade, number, sum(number)over(order by grade)num
    from class_grade
)

2.将总数分奇偶数进行判断:当总数是奇数时,利用limit=1,取出1个grade;

b as(
    select grade,num
    from t0
    where t0.num >= (select sum(number) from class_grade)/2
    order by num
    limit 1
)

当总数是偶数时,再分情况判断:如果grade的最差排名数 >= 总数/2 + 1,则只输出1个grade;grade的最差排名数 >= 总数/2 输出2个grade

a as(
    select grade,num
    from t0
    where t0.num >= (select sum(number) from class_grade)/2
    order by num
    limit 2
),
,
c as(
    select grade,num
    from t0
    where t0.num >= (select sum(number) from class_grade)/2+1
    order by num
    limit 1
)

3.最后取出中位数grade,将以上a,b,c三个表左连接,通过ifnull函数剔除联表查询中的空值

select ifnull(case when (select sum(number) from class_grade)%2=0 //取模判断奇偶
              then (case when a.num >=(select sum(number) from class_grade)/2+1 //判断总数为偶数时两个中位数是否均在同一个grade中
                   then c.grade//是的话取其中1个
                   else a.grade end)//不是的话取2个
              else b.grade end, '')
from a left join b on a.grade = b.grade
        left join c on a.grade = c.grade
全部评论

相关推荐

1.自我介绍2.介绍一下mcp, skills3.了解react哪些状态管理库4.对话是sse还是什么?是用fetch还是EventSource?5.ts中的any 和 unknown讲一讲6.是直接用组件库的组件还是自己封装了一些别的7.代码输出题1function main() {{var a = 1let b = 2}console.log(a);console.log(b);}main()console.log(a);8.什么是块级作用域 全局作用域 函数作用域9.代码输出题2for (var i = 0;i < 5;i++) {setTimeout(() => {console.log(i);}, 100);}10.代码输出题3for (var i = 0; i < 5; i++){function printText(temp) {setTimeout(() => {console.log(temp);}, 100);}printText(i)}11.代码输出题4for(var i = 0;i < 5;i++){function printText(temp) {var temp = isetTimeout(() => {console.log(temp);}, 100);}printText(i)}12.代码输出题5for(var i = 0;i < 5;i++){function printText(temp) {setTimeout(() => {var temp = iconsole.log(temp);}, 100);}printText(i)}13.点击控制台输出题export default function App() {const [count, setCount] = useState(0)console.log('render',count)return (<div><h1>{count}</h1>{setCount(count + 1)setTimeout(() => console.log('setTimeout', count), 1000)}}>+1</div>)}//这个组件点击按钮后,控制台的输出顺序和值如下:// 1. render 1 (组件重新渲染, count 更新为 1)// 2. setTimeout 0 (1秒后输出,注意这里是 0 而不是 1)14.算法:给有序数组arr = [-4, -1, 0, 3, 5],返回平方后的排序// 有序数组平方后排序const arr = [-4, -1, 0, 3, 5]function solution(arr) {const len = arr.lengthconst result = new Array(len)let left = 0let right = len - 1let index = len - 1while (left <= right) {if (arr[left] * arr[left] > arr[right] * arr[right]) {result[index] = arr[left] * arr[left]left++} else {result[index] = arr[right] * arr[right]right--}index--}return result}console.log(solution(arr));15.反问
查看14道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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