中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

經典sql題和Java算法題分析

發布時間:2021-11-24 14:46:41 來源:億速云 閱讀:186 作者:iii 欄目:大數據

這篇文章主要講解了“經典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
## 解法1
SELECT num
FROM
  (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 ) tmp2
GROUP BY num,
         gid
HAVING count(*) >= 2


## 解法2  
select
  num,
  gid,
  count(1) as c
from
(
select
id,
num,
id-row_number() over(PARTITION BY num ORDER BY id) as gid
from 
(select * from logs order by num,id) a
) b
group by num,gid

后面想到了更好的,其實不用lag,也不用order by 全局排序,id 的作用和日期一樣,一般是用來配合row_number來解決連續問題的,所以row_number必不可少,那么可以這樣寫(神他媽簡單是不是,別想復雜了):

SELECT num,
       gid
FROM
  (SELECT num,
          id-row_number() OVER (PARTITION BY num
                                ORDER BY id) gid
   FROM logs)
GROUP BY num,
         gid
HAVING 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算法題分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉化市| 长沙县| 苍南县| 河池市| 宕昌县| 福鼎市| 宁国市| 利津县| 荔浦县| 庆云县| 乌海市| 焉耆| 台南市| 柞水县| 贵阳市| 青田县| 务川| 岳池县| 壶关县| 株洲市| 应用必备| 马公市| 米易县| 巨鹿县| 黄石市| 邛崃市| 万山特区| 汪清县| 新余市| 晴隆县| 广南县| 楚雄市| 石屏县| 武宣县| 孝感市| 乳山市| 长乐市| 正定县| 皮山县| 湛江市| 库伦旗|