千家信息网

经典sql题和Java算法题分析

发表于:2025-02-09 作者:千家信息网编辑
千家信息网最后更新 2025年02月09日,这篇文章主要讲解了"经典sql题和Java算法题分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"经典sql题和Java算法题分析"吧!1.sql题描
千家信息网最后更新 2025年02月09日经典sql题和Java算法题分析

这篇文章主要讲解了"经典sql题和Java算法题分析",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"经典sql题和Java算法题分析"吧!

1.sql题描述

话说有一个日志表,只有两列,分别是连续id和num 至于啥意思,把它当金额把。现在想知道连续次数3次及以上的num,数据如下

idnum
11
21
31
42
53
64
74
84

那么结果只有1,4满足条件,问这个sql该怎么写?

2.思路和解法

分析:题目简单,没有歧义,能看得懂,像连续几次的这种问题一定是用到窗口函数,首先想到的是排名row_number 然后lag 怎么体现连续呢,肯定是需要用到一个排序的id,由于题目给了id是连续递增的,可以省去row_number了

所以第一步,上lag,结果就是如下:

idnumlagid
11null
210
310
421
531
641
740
840

得到lagid后,连续怎么用呢,首先只有为0的才满足条件,所以可以做一个筛选,结果就如下表去掉xxx的,下面观察0的行,怎么区分3 行的 0 和 7行的 0呢,想到使用新分组,rid 这样就把lagid 相同,num相同的排序,最后再加一列,id-rid 相同的分为一组

idnumlagidridgid
11null xxx

21011
31021
421 xxx

531 xxx

641 xxx

74016
84026
-- 完整sql## 解法1SELECT numFROM  (SELECT id,          num,          lagid,          (id-row_number() over(PARTITION BY num, lagid                                ORDER BY id)) AS gid   FROM     (SELECT id,             num,             num- lag(num) (OVER PARTITION BY 1                            ORDER BY id) AS lagid) tmp1   WHERE lagid=0 ) tmp2GROUP BY num,         gidHAVING count(*) >= 2## 解法2  select  num,  gid,  count(1) as cfrom(selectid,num,id-row_number() over(PARTITION BY num ORDER BY id) as gidfrom (select * from logs order by num,id) a) bgroup by num,gid

后面想到了更好的,其实不用lag,也不用order by 全局排序,id 的作用和日期一样,一般是用来配合row_number来解决连续问题的,所以row_number必不可少,那么可以这样写(神他妈简单是不是,别想复杂了):

SELECT num,       gidFROM  (SELECT num,          id-row_number() OVER (PARTITION BY num                                ORDER BY id) gid   FROM logs)GROUP BY num,         gidHAVING count(1) >= 3

3. Java题描述

首先,给你一个初始数组 arr。然后,每天你都要根据前一天的数组生成一个新的数组。第 i 天所生成的数组,是由你对第 i-1 天的数组进行如下操作所得的:假如一个元素小于它的左右邻居,那么该元素自增 1。假如一个元素大于它的左右邻居,那么该元素自减 1。

首、尾元素 永不 改变。

过些时日,你会发现数组将会不再发生变化,请返回最终所得到的数组。

示例 1:

输入:[6,2,3,4]

输出:[6,3,3,4]

解释:

第一天,数组从 [6,2,3,4] 变为 [6,3,3,4]。

无法再对该数组进行更多操作。

示例 2:

输入:[1,6,3,4,3,5]

输出:[1,4,4,4,4,5]

解释:

第一天,数组从 [1,6,3,4,3,5] 变为 [1,5,4,3,4,5]。

第二天,数组从 [1,5,4,3,4,5] 变为 [1,4,4,4,4,5]。

无法再对该数组进行更多操作。

3.3 分析和解法

  1. 首先考虑一轮遍历怎么写,应该很简单把,思路就是一个大小为3的窗口

  2. 用一个flag来标志每一轮是否有改过数据。那么代码如下:

public int[] get(int[] input) {    if (input == null || input.length <=2)        return input;    boolean flag = false;        do {            flag = false;            for (int i=1;i+1 < input.length;i++){                if (input[i] < input[i+1] && input[i] < input[i-1] ) {                    input[i] +=1;                    if (!flag)                        flag = true;                }                if (input[i] > input[i+1] && input[i] > input[i-1] ) {                    input[i] -=1;                    if (!flag)                        flag = true;                    }            }        } while(flag)        return input;}

感谢各位的阅读,以上就是"经典sql题和Java算法题分析"的内容了,经过本文的学习后,相信大家对经典sql题和Java算法题分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0