base64 能放数组里面么_数组:总结篇
我們做個(gè)總結(jié)吧
數(shù)組理論基礎(chǔ)
數(shù)組是非常基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),在面試中,考察數(shù)組的題目一般在思維上都不難,主要是考察對(duì)代碼的掌控能力
也就是說,想法很簡(jiǎn)單,但實(shí)現(xiàn)起來 可能就不是那么回事了。
首先要知道數(shù)組在內(nèi)存中的存儲(chǔ)方式,這樣才能真正理解數(shù)組相關(guān)的面試題
「數(shù)組是存放在連續(xù)內(nèi)存空間上的相同類型數(shù)據(jù)的集合。」
數(shù)組可以方便的通過下表索引的方式獲取到下表下對(duì)應(yīng)的數(shù)據(jù)。
舉一個(gè)字符數(shù)組的例子,如圖所示:
需要兩點(diǎn)注意的是
- 「數(shù)組下表都是從0開始的。」
- 「數(shù)組內(nèi)存空間的地址是連續(xù)的」
正是「因?yàn)閿?shù)組的在內(nèi)存空間的地址是連續(xù)的,所以我們?cè)趧h除或者增添元素的時(shí)候,就難免要移動(dòng)其他元素的地址。」
例如刪除下表為3的元素,需要對(duì)下表為3的元素后面的所有元素都要做移動(dòng)操作,如圖所示:
而且大家如果使用C++的話,要注意vector 和 array的區(qū)別,vector的底層實(shí)現(xiàn)是array,嚴(yán)格來講vector是容器,不是數(shù)組。
「數(shù)組的元素是不能刪的,只能覆蓋。」
那么二維數(shù)組直接上圖,大家應(yīng)該就知道怎么回事了
「那么二維數(shù)組在內(nèi)存的空間地址是連續(xù)的么?」
我們來舉一個(gè)例子,例如:int[][] rating = new int[3][4]; , 這個(gè)二維數(shù)據(jù)在內(nèi)存空間可不是一個(gè) 3*4 的連續(xù)地址空間
看了下圖,就應(yīng)該明白了:
所以「二維數(shù)據(jù)在內(nèi)存中不是 3*4 的連續(xù)地址空間,而是四條連續(xù)的地址空間組成!」
數(shù)組的經(jīng)典題目
在面試中,數(shù)組是必考的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)。
其實(shí)數(shù)據(jù)的題目在思想上一般比較簡(jiǎn)單的,但是如果想高效,并不容易。
我們之前一共講解了四道經(jīng)典數(shù)組題目,每一道題目都代表一個(gè)類型,一種思想。
二分法
數(shù)組:每次遇到二分法,都是一看就會(huì),一寫就廢
這道題目呢,考察的數(shù)據(jù)的基本操作,思路很簡(jiǎn)單,但是在通過率在簡(jiǎn)單題里并不高,不要輕敵。
可以使用暴力解法,通過這道題目,如果要求更優(yōu)的算法,建議試一試用二分法,來解決這道題目
暴力解法時(shí)間復(fù)雜度:O(n)
二分法時(shí)間復(fù)雜度:O(logn)
在這道題目中我們講到了「循環(huán)不變量原則」,只有在循環(huán)中堅(jiān)持對(duì)區(qū)間的定義,才能清楚的把握循環(huán)中的各種細(xì)節(jié)。
「二分法是算法面試中的常考題,建議通過這道題目,鍛煉自己手撕二分的能力」。
雙指針法
數(shù)組:就移除個(gè)元素很難么?
雙指針法(快慢指針法):「通過一個(gè)快指針和慢指針在一個(gè)for循環(huán)下完成兩個(gè)for循環(huán)的工作。」
暴力解法時(shí)間復(fù)雜度:O(n^2)
雙指針時(shí)間復(fù)雜度:O(n)
這道題目迷惑了不少同學(xué),糾結(jié)于數(shù)組中的元素為什么不能刪除,主要是因?yàn)橐韵聝牲c(diǎn):
- 數(shù)組在內(nèi)存中是連續(xù)的地址空間,不能釋放單一元素,如果要釋放,就是全釋放(程序運(yùn)行結(jié)束,回收內(nèi)存棧空間)。
- C++中vector和array的區(qū)別一定要弄清楚,vector的底層實(shí)現(xiàn)是array,所以vector展現(xiàn)出友好的一些都是因?yàn)榻?jīng)過包裝了。
雙指針法(快慢指針法)在數(shù)組和鏈表的操作中是非常常見的,很多考察數(shù)組和鏈表操作的面試題,都使用雙指針法。
滑動(dòng)窗口
數(shù)組:滑動(dòng)窗口拯救了你
本題介紹了數(shù)組操作中的另一個(gè)重要思想:滑動(dòng)窗口。
暴力解法時(shí)間復(fù)雜度:O(n^2)
滑動(dòng)窗口時(shí)間復(fù)雜度:O(n)
本題中,主要要理解滑動(dòng)窗口如何移動(dòng) 窗口起始位置,達(dá)到動(dòng)態(tài)更新窗口大小的,從而得出長(zhǎng)度最小的符合條件的長(zhǎng)度。
「滑動(dòng)窗口的精妙之處在于根據(jù)當(dāng)前子序列和大小的情況,不斷調(diào)節(jié)子序列的起始位置。從而將O(n^2)的暴力解法降為O(n)。」
如果沒有接觸過這一類的方法,很難想到類似的解題思路,滑動(dòng)窗口方法還是很巧妙的。
模擬行為
數(shù)組:這個(gè)循環(huán)可以轉(zhuǎn)懵很多人
模擬類的題目在數(shù)組中很常見,不涉及到什么算法,就是單純的模擬,十分考察大家對(duì)代碼的掌控能力。
在這道題目中,我們?cè)僖淮谓榻B到了「循環(huán)不變量原則」,其實(shí)這也是寫程序中的重要原則。
相信大家又遇到過這種情況:感覺題目的邊界調(diào)節(jié)超多,一波接著一波的判斷,找邊界,踩了東墻補(bǔ)西墻,好不容易運(yùn)行通過了,代碼寫的十分冗余,毫無章法,其實(shí)「真正解決題目的代碼都是簡(jiǎn)潔的,或者有原則性的」,大家可以在這道題目中體會(huì)到這一點(diǎn)。
總結(jié)
從二分法到雙指針,從滑動(dòng)窗口到螺旋矩陣,相信如果大家真的認(rèn)真做了「代碼隨想錄」每日推薦的題目,定會(huì)有所收獲。
推薦的題目即使大家之前做過了,再讀一遍的文章,也會(huì)幫助你提煉出解題的精髓所在。
「如果感覺有所收獲,希望大家多多支持,打卡轉(zhuǎn)發(fā),點(diǎn)贊在看 都是對(duì)我最大的鼓勵(lì)!」
最后,大家周末愉快!
在留言區(qū)留下你的思路吧!
-------end-------
我將算法學(xué)習(xí)相關(guān)的資料已經(jīng)整理到了Github :https://github.com/youngyangyang04/leetcode-master,里面還有l(wèi)eetcode刷題攻略、各個(gè)類型經(jīng)典題目刷題順序、思維導(dǎo)圖看一看一定會(huì)有所收獲!
每天8:35準(zhǔn)時(shí)推送一道經(jīng)典算法題目,推送的每道題目都不是孤立的,而是由淺入深,環(huán)環(huán)相扣,幫你梳理算法知識(shí)脈絡(luò),輕松學(xué)算法!
「@代碼隨想錄」期待你的關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的base64 能放数组里面么_数组:总结篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux后台启动脚本nohup,lin
- 下一篇: Pytorch:数据并行和模型并行,解决