<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          都在刷的力扣算法題,居然長(zhǎng)這樣?

          共 10290字,需瀏覽 21分鐘

           ·

          2021-07-27 16:34

          大家好,可以叫我才哥。

          最近 有好朋友在咱們交流群分享力扣算法題,感覺還蠻好玩的。然后才哥去力扣看了看,很快就慫了,覺得自己像個(gè)傻子,傻傻的都不會(huì)寫!!

          不過,硬著頭皮寫了一段時(shí)間,發(fā)現(xiàn)還是收獲很多,對(duì)于鍛煉邏輯思維能力和編碼能力都有很不錯(cuò)的助力,就是費(fèi)時(shí)間一個(gè)算法題可能要研究一個(gè)晚上才能獨(dú)立碼出理想的代碼。

          那么,力扣里的算法題都是什么樣的呢?大家都喜歡刷什么難度的題,通過率都如何?咱們今天就簡(jiǎn)單介紹一下吧!

          目錄:

          • 1. 數(shù)據(jù)獲取

          • 2. 數(shù)據(jù)可視化

            • 2.1. 難度分布

            • 2.2. 通過率分布

            • 2.3. 提交數(shù)分布

            • 2.4. 題解數(shù)分布

          • 3. 那些最熱門和最噩夢(mèng)的算法題

            • 3.1. 最熱門

            • 3.2. 最噩夢(mèng)

            • 3.3. 最簡(jiǎn)單?

          1. 數(shù)據(jù)獲取

          直接用python從力扣爬取全部算法題題庫(kù)列表數(shù)據(jù)即可

          # 題庫(kù)列表數(shù)據(jù)接口地址
          url = 'https://leetcode-cn.com/api/problems/all/'
          力扣題庫(kù)

          由于獲取的數(shù)據(jù)是json格式的,所以比較好解析,具體數(shù)據(jù)爬取及清洗處理過程見下面代碼:

          import requests
          import pandas as pd

          url = 'https://leetcode-cn.com/api/problems/all/'
          r = requests.get(url)
          data = r.json()
          # 多層字典解析
          df = pd.json_normalize(data['stat_status_pairs'])
          # 只篩選需要用到的列
          df = df[['stat.question_id''stat.question__title',
                   'stat.total_acs''stat.total_submitted',
                   'stat.total_column_articles''stat.frontend_question_id',
                   'difficulty.level']]
          # 重命名列名為中文名
          df.columns = ['id''題目名稱',
                        '通過數(shù)''提交數(shù)',
                        '題解數(shù)''題目id',
                        '難度']
          # 將難度枚舉數(shù)字替換為 描述形容詞(這里用到replace)
          df['難度'].replace([123], ['簡(jiǎn)單''中等''困難'], inplace=True)
          # 計(jì)算通過率(這里用到assign)
          df = df.assign(通過率 = df.通過數(shù)/df.提交數(shù))
          # 由于題目id含有標(biāo)簽(如LCP 11、面試題 17等),這里將標(biāo)簽解析出來為(LCP、面試題等)
          df = df.assign(題目標(biāo)簽 = df.題目id.str.extract(r'(\S*?\s*\S*?)[\s]*\d+'))
          df['題目標(biāo)簽'].replace('''ID類', inplace=True)
          df.head()
          數(shù)據(jù)預(yù)覽

          這里涉及到幾個(gè)pandas函數(shù)的使用,大家可以參考?xì)v史推文《再推薦幾個(gè)好用的pandas函數(shù),繼續(xù)加快你數(shù)據(jù)處理的速度》和《學(xué)會(huì)這些好用的pandas函數(shù),讓你的數(shù)據(jù)處理更快人一步》進(jìn)行更多了解。

          2. 數(shù)據(jù)可視化

          對(duì)于力扣的題庫(kù),我們簡(jiǎn)單看看難度分布、通過率、提交數(shù)分布等等情況,以及了解下通過率最低的都是什么魔鬼題目呢!?

          本文數(shù)據(jù)可視化部分使用的是可視化庫(kù)plotly,感興趣的可以參考此前教程了解:

          2.1. 難度分布

          在一共的2,026道算法題中,中等難度最多高達(dá)1,051題占比51.9%,其次是簡(jiǎn)單難度占比27.7%,困難難度一共414題僅占20.4%。

          整體難度分布

          繪圖代碼:

          # 力扣算法題難度分布
          import plotly.express as px

          df['值'] = 1
          fig = px.pie(df, values="值", names='難度'
                       color_discrete_sequence=px.colors.sequential.RdBu,
                       hole=.3# 設(shè)置空心半徑比例
                       title='力扣算法題難度分布',
                      )
          fig.update_traces(textposition='inside'
                            textinfo='percent+label+value' # 數(shù)據(jù)標(biāo)簽顯示的內(nèi)容
                           )
          fig.show()

          那么,不同標(biāo)簽下難度分布情況又是什么樣呢?

          • 純ID類的算法題最多,高達(dá)1,815題,占了整個(gè)題庫(kù)的90%,它的中等難度題955題占自身題量的53%
          • 面試題類的算法題共112題,中等難度也是最多共61題占比54%,它的困難難度僅占自身題量的12%
          • 劍指 Offer類算法題共72題,簡(jiǎn)單難度反而最多占比51%,困難難度的僅5題只占自身題量的7%而已
          • LCP 類算法題共27題,則主要以困難難度為主,共14題占自身題量的52%

          繪圖代碼:

          import plotly.express as px

          fig = px.sunburst(df, 
                            path=['題目標(biāo)簽''難度'], 
                            values="值",
                            title='力扣算法題不同標(biāo)簽下的難度分布',
                           )
          fig.update_traces(textinfo='percent parent+label+value' # 數(shù)據(jù)標(biāo)簽顯示的內(nèi)容
                           )
          fig.show()

          2.2. 通過率分布

          整體來看,大部分的算法題的通過率集中在0.4-0.6之間,還蠻近正態(tài)分布的。

          整體通過率分布

          我們對(duì)不同難度的算法題進(jìn)行拆分看通過率,發(fā)現(xiàn)確實(shí)滿足簡(jiǎn)單的通過率普遍較高、中等的更接近正態(tài)分布,困難模式下通過率低了很多。

          不同難度算法題通過率分布

          繪圖代碼:

          # 繪制通過率直方圖
          import plotly.express as px

          fig = px.histogram(df, x="通過率",
                             nbins=20# 分成20組
                             facet_row="難度",
                             title='力扣算法題不同難度通過率分布',
                             height=600,
                             category_orders={"難度": ["簡(jiǎn)單""中等""困難"]}
                            )
          fig.show()

          2.3. 提交數(shù)分布

          力扣是2018年2月進(jìn)入中國(guó)大陸,至今剛好3年有余,我們發(fā)現(xiàn)最高的提交數(shù)就是ID類第1題的兩數(shù)之和,高達(dá)超過379萬次提交,不過通過率居然僅僅50.8%不到,有點(diǎn)意思。

          提交數(shù)最多的范圍是在1萬-5萬之間,其次是5千-1萬,再次是10萬-50萬。絕大多數(shù)算法題的提交數(shù)是較多的,畢竟可以重復(fù)提交看優(yōu)化代碼后的性能效率嘛。

          提交數(shù)分布

          我們對(duì)不同難度的算法題按照提交數(shù)和通過率繪制樹狀熱圖如下:中等難度整體提交數(shù)高于簡(jiǎn)單難度。

          (綠色表示通過率大于50%,紫紅色表示通過率低于50%)

          提交數(shù)及通過率樹狀矩形圖

          繪圖代碼:

          import plotly.express as px
          import numpy as np

          df["all"] = "全部力扣算法題提交數(shù)及通過率" # in order to have a single root node
          fig = px.treemap(df, path=['all''難度''題目名稱'], values='提交數(shù)',
                            color='通過率',
                            color_continuous_scale='PiYG',
                            color_continuous_midpoint=0.5,
                            height = 560,
                            width = 1200,
                          )
          fig.show()

          2.4. 題解數(shù)分布

          對(duì)于我這種算法小白來說,看題解是很過癮的。在力扣題庫(kù)里,大多數(shù)的算法題題解在100以內(nèi),其實(shí)100-200,200-500范圍內(nèi)。不過,實(shí)際看題解的時(shí)候會(huì)發(fā)現(xiàn)題解下面的評(píng)論也是很精彩的,畢竟大家都會(huì)踴躍討論,氛圍組!

          題解數(shù)分布

          和提交數(shù)與通過率的樹狀矩形圖中中等難度提交數(shù)更多稍有不同,簡(jiǎn)單模式的題解數(shù)更多些:

          題解數(shù)及通過率樹狀矩形圖

          3. 那些最熱門和最噩夢(mèng)的算法題

          在合計(jì)1.416億次提交數(shù),0.746億次通過數(shù),63.61萬次題解數(shù)中,最熱門和噩夢(mèng)的算法題都長(zhǎng)什么樣呢?

          3.1. 最熱門

          我們先看提交數(shù)最多的前三甲

          提交數(shù)最多

          分別是ID類的前3題,最多提交也正常了,畢竟曝光最多嘛

          1. 兩數(shù)之和:379萬次提交
          2. 無重復(fù)字符的最長(zhǎng)子串:249萬次提交
          3. 兩數(shù)相加:195萬次提交

          再看題解數(shù)最多的前三甲

          題解數(shù)最多

          對(duì)于兩數(shù)之和與兩數(shù)相加在意料之中,居然還冒出了第206題反轉(zhuǎn)鏈表題解高達(dá)6千多,這題的通過率也是老高了達(dá)到71.48%!!

          3.2. 最噩夢(mèng)

          所謂最噩夢(mèng),我們以通過率最低為標(biāo)尺,可以看到有這么幾題通過率居然都低于17%,妥妥的困難模式!

          通過率最低

          最噩夢(mèng)之一5707. 得到新鮮甜甜圈的最多組數(shù)

          >
          有一個(gè)甜甜圈商店,每批次都烤 batchSize 個(gè)甜甜圈。這個(gè)店鋪有個(gè)規(guī)則,就是在烤一批新的甜甜圈時(shí),之前所有甜甜圈都必須已經(jīng)全部銷售完畢。給你一個(gè)整數(shù) batchSize 和一個(gè)整數(shù)數(shù)組 groups ,數(shù)組中的每個(gè)整數(shù)都代表一批前來購(gòu)買甜甜圈的顧客,其中 groups[i] 表示這一批顧客的人數(shù)。每一位顧客都恰好只要一個(gè)甜甜圈。當(dāng)有一批顧客來到商店時(shí),他們所有人都必須在下一批顧客來之前購(gòu)買完甜甜圈。如果一批顧客中第一位顧客得到的甜甜圈不是上一組剩下的,那么這一組人都會(huì)很開心。你可以隨意安排每批顧客到來的順序。請(qǐng)你返回在此前提下,最多 有多少組人會(huì)感到開心。

          示例 1:
          輸入:batchSize = 3, groups = [1,2,3,4,5,6]
          輸出:4
          解釋:你可以將這些批次的顧客順序安排為 [6,2,4,5,1,3] 。那么第 1,2,4,6 組都會(huì)感到開心。

          示例 2:
          輸入:batchSize = 4, groups = [1,3,2,5,2,2,1,6]
          輸出:4

          來源:力扣(LeetCode)
          鏈接:https://leetcode-cn.com/problems/maximum-number-of-groups-getting-fresh-donuts
          著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

          最噩夢(mèng)之二1622. 奇妙序列

          >
          請(qǐng)你實(shí)現(xiàn)三個(gè) API append,addAll 和 multAll 來實(shí)現(xiàn)奇妙序列。

          請(qǐng)實(shí)現(xiàn) Fancy 類 :

          Fancy() 初始化一個(gè)空序列對(duì)象。
          void append(val) 將整數(shù) val 添加在序列末尾。
          void addAll(inc) 將所有序列中的現(xiàn)有數(shù)值都增加 inc 。
          void multAll(m) 將序列中的所有現(xiàn)有數(shù)值都乘以整數(shù) m 。
          int getIndex(idx) 得到下標(biāo)為 idx 處的數(shù)值(下標(biāo)從 0 開始),并將結(jié)果對(duì) 109 + 7 取余。如果下標(biāo)大于等于序列的長(zhǎng)度,請(qǐng)返回 -1 。
           

          示例:

          輸入:
          ["Fancy""append""addAll""append""multAll""getIndex""addAll""append""multAll""getIndex""getIndex""getIndex"]
          [[], [2], [3], [7], [2], [0], [3], [10], [2], [0], [1], [2]]
          輸出:
          [null, null, null, null, null, 10, null, null, null, 26, 34, 20]

          解釋:
          Fancy fancy = new Fancy();
          fancy.append(2);   // 奇妙序列:[2]
          fancy.addAll(3);   // 奇妙序列:[2+3] -> [5]
          fancy.append(7);   // 奇妙序列:[5, 7]
          fancy.multAll(2);  // 奇妙序列:[5*2, 7*2] -> [10, 14]
          fancy.getIndex(0); // 返回 10
          fancy.addAll(3);   // 奇妙序列:[10+3, 14+3] -> [13, 17]
          fancy.append(10);  // 奇妙序列:[13, 17, 10]
          fancy.multAll(2);  // 奇妙序列:[13*2, 17*2, 10*2] -> [26, 34, 20]
          fancy.getIndex(0); // 返回 26
          fancy.getIndex(1); // 返回 34
          fancy.getIndex(2); // 返回 20

          來源:力扣(LeetCode)
          鏈接:https://leetcode-cn.com/problems/fancy-sequence

          最噩夢(mèng)之三564. 尋找最近的回文數(shù)

          >
          給定一個(gè)整數(shù) n ,你需要找到與它最近的回文數(shù)(不包括自身)。

          “最近的”定義為兩個(gè)整數(shù)差的絕對(duì)值最小。

          示例 1:

          輸入: "123"
          輸出: "121"
          注意:

          n 是由字符串表示的正整數(shù),其長(zhǎng)度不超過18。
          如果有多個(gè)結(jié)果,返回最小的那個(gè)。

          來源:力扣(LeetCode)
          鏈接:https://leetcode-cn.com/problems/find-the-closest-palindrome

          3.3. 最簡(jiǎn)單?

          通過率最高的居然高達(dá)90%,其中還有2個(gè)是中等難度的。。

          通過率最高

          不過,這三題都是會(huì)員可見:

          1. 可回收且低脂的產(chǎn)品:通過率 93.7%
          2. 逆序打印不可變鏈表:通過率 91.8%
          3. 兩個(gè)稀疏向量的點(diǎn)積:通過率 89.3%

          除了會(huì)員可見的外,通過率最高的是一個(gè)中等難度題,也有高達(dá)86.9%的通過率

          1689. 十-二進(jìn)制數(shù)的最少數(shù)目

          >
          如果一個(gè)十進(jìn)制數(shù)字不含任何前導(dǎo)零,且每一位上的數(shù)字不是 0 就是 1 ,
          那么該數(shù)字就是一個(gè) 十-二進(jìn)制數(shù) 。例如,101 和 1100 都是 十-二進(jìn)制數(shù),
          而 112 和 3001 不是。

          給你一個(gè)表示十進(jìn)制整數(shù)的字符串 n ,返回和為 n 的 十-二進(jìn)制數(shù) 的最少數(shù)目。
           
          示例 1:
          輸入:n = "32"
          輸出:3
          解釋:10 + 11 + 11 = 32

          示例 2:
          輸入:n = "82734"
          輸出:8

          示例 3:
          輸入:n = "27346209830709182346"
          輸出:9

          來源:力扣(LeetCode)
          鏈接:https://leetcode-cn.com/problems/partitioning-into-minimum-number-of-deci-binary-numbers

          以上就是本期全部?jī)?nèi)容,感興趣的可以試試。




          往期精彩回顧



          • 想和小師妹聊天?

          • 想看海量行業(yè)資料?

          • 想學(xué)習(xí)陳老師的思維方式?

          • 想和陳老師討論具體工作遇到的問題?

          • 想在求職、轉(zhuǎn)行、轉(zhuǎn)崗道路上得到一對(duì)一親自指導(dǎo)?


           掃描二維碼 

          ↓ ↓ ↓加入十年數(shù)據(jù)人陳老師的知識(shí)星球 ↓ ↓ ↓

          瀏覽 78
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爆操欧美 | 国产AⅤ无码片毛片一级一区2 | 免费黄色一级电影 | 人人妻人人操人人屌 | 欧美乱伦精品 |