前言? 為什么前端需要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法
首先笔喉,算法是一個很抽象并且廣發(fā)的概念,我們生活中所做的很多事情都可以說是涉及到算法甥材。收拾房間的時候,選擇先收拾哪性含,在收拾哪洲赵。周末選擇還洗衣服還是先整理花草等等。 想把事情做好,就要在做事情之前先有所規(guī)劃叠萍,而寫代碼也是一樣芝发。
當(dāng)我們接到一個需求的時候,首先要做的就是對需求進(jìn)行梳理苛谷,對需求的梳理首先就是與產(chǎn)品確定需求是做什么的后德,哪些功能是可以實現(xiàn)的,哪些功能是很耗時的抄腔,還有一些是耗時并且效果也盡如人意瓢湃。還有一些是需要進(jìn)行技術(shù)調(diào)研的。
當(dāng)然對于前端很重要的還有就是交互方式赫蛇,要考慮的是產(chǎn)品和交互想要的效果绵患,能不能實現(xiàn),會不會出現(xiàn)什么問題悟耘,從技術(shù)的角度來給出建議落蝙,其次就是評估時間成本。
還有些需求看起來很簡單暂幼,但是實際業(yè)務(wù)場景很復(fù)雜筏勒。我們要和后臺確認(rèn)交互方式,哪些是接口實現(xiàn)的旺嬉,哪些需要前端進(jìn)行數(shù)據(jù)緩存管行,還有前置校驗。復(fù)雜的交互可能會大大的占用開發(fā)聯(lián)調(diào)時間邪媳,導(dǎo)致工時評估不準(zhǔn)確捐顷。會造成感工期造成的加班。
最近大家應(yīng)該都經(jīng)歷了或者聽說了雨效,經(jīng)濟低迷迅涮,市場行情不好,用同事的話概況就是徽龟,招人的公司80%都是外包叮姑,剩下的20%要求特別高,為什么呢据悔?首先因為失業(yè)人群在不斷的壯大传透,大量公司倒閉。20%的公司在吸收原來100%的人員屠尊,所以現(xiàn)在是甲方市場旷祸,公司當(dāng)然是擇優(yōu)錄取,首先就從學(xué)歷讼昆、履歷、背景來卡掉大部分人。
以前我也曾經(jīng)不服氣浸赫,說高中沒好好學(xué)習(xí)的人闰围,長大以后不一定就不優(yōu)秀。還記得那時候的cto說既峡,他們也知道羡榴,有些人也優(yōu)秀,但是211 985 中的優(yōu)秀的概率會更大运敢。限制了門檻校仑,節(jié)約了很多篩選的時間和成本。以前經(jīng)濟好的時候传惠,我從來沒有覺得自己比那些好學(xué)校的差很多迄沫,現(xiàn)在的現(xiàn)實告訴我,小時候好好學(xué)習(xí)還是很重要的卦方。
好了羊瘩,廢話就說到這里吧。上面大概是我決定好好做個人的前提盼砍,計劃從今天開始把數(shù)據(jù)結(jié)構(gòu)和算法學(xué)習(xí)記錄一遍尘吗。希望大家共勉。
本文主要是基于數(shù)據(jù)結(jié)構(gòu)與算法書為原型加上自己的理解浇坐,如有不對的地方睬捶,望大家海涵。
本章節(jié)計劃在半個月內(nèi)更新完近刘,每天更新一章侧戴。
第一章 數(shù)組
2.1? 什么是數(shù)組,數(shù)組是特殊的對象
概念: 一個存儲元素的線性集合跌宛,元素可以通過索引來任意取值酗宋,索引通常是數(shù)字,用來計算元素之間存儲位置的偏移量疆拘。
首先數(shù)組不是js獨有的蜕猫,幾乎所有的編程語言都有數(shù)組,但是js的數(shù)組與其他語言的有所不同哎迄。js的數(shù)組是一種特殊的對象回右,用來表示偏移量的索引是該對象的屬性,索引可能是整數(shù)漱挚。因為js對象中的屬性必須是字符串翔烁,所以這些索引在內(nèi)部被轉(zhuǎn)換成字符串類型。由于數(shù)組在js中是一種特殊對象旨涝,所以性能上沒有其他語言中的高效蹬屹。
2.2 數(shù)組的使用
2.2.1 創(chuàng)建數(shù)組
方法一 字面量方式創(chuàng)建
空數(shù)組 var numbers = [];
不為空的數(shù)組 var numbers = [1,2,3,4,5] console.log(numbers.length)
方法二 構(gòu)造函數(shù)創(chuàng)建數(shù)組
var numbers = new Array(1,2,3,4,5);
只傳入一個參數(shù)的時候,表示數(shù)組的長度。
var numbers = new Array(20)
js的數(shù)組慨默,每一個值可以是不同的類型贩耐。如何判斷一個對象是不是數(shù)組呢?Array.isArray()
2.2.2 讀寫數(shù)組
通過循環(huán)給數(shù)組賦值
var nums = [];
for(var i =0; i<100;++i) {
nums[i] = i+1;
}
console.log(nums[0])
js的數(shù)組長度是可以任意增長的厦取,可以超出創(chuàng)建的長度潮太。
2.2.3 由字符串生成數(shù)組
這里涉及到一個常用知識點,字符串轉(zhuǎn)換成數(shù)組的方法虾攻。split() 那么它的工作原理是什么呢铡买?
var sentence = "the quick brown fox jumped over the lazy cat";
var words = sentence.split(" ");
for(var i =0;i<words.lemgth;++i) {
????console.log('word' + i + ":" + words[i]);
}
2.2.4 對數(shù)組的整體操作
1 整體賦值 將一個數(shù)組整體賦值給另一個數(shù)組。這里會涉及到數(shù)組是引用類型霎箍,直接賦值只是給數(shù)組增加了一個引用奇钞,改變數(shù)組兩個值都會改變。這種行為是淺拷貝朋沮,新數(shù)組依然指向原來的數(shù)組蛇券。那么怎樣才能實現(xiàn)深拷貝呢。通過循環(huán)賦值樊拓,逐項拷貝纠亚。
function copy (arr1,arr2) {
????for(let i=0;i<arr1.length;++i) {
????????arr2[i] = arr1[i];
????}
}
2.3 存取函數(shù)
概念: js提供了一組用來訪問數(shù)組元素的函數(shù),叫做存取函數(shù)筋夏,這些函數(shù)返回數(shù)據(jù)的某種變體蒂胞。
2.3.1查找元素
Array.indexOf(name)如果存在返回具體位置,如果不存在返回-1 条篷。indexOf()只返回第一個查找到的元素的位置骗随。lastIndexOf 返回元素中最后一個相同的索引。
2.3.2 數(shù)組轉(zhuǎn)換成字符串
join()和toString()
2.3.3 會生成新數(shù)組的方法
concat()? 連接多個數(shù)組創(chuàng)建新數(shù)組赴叹。返回值為新數(shù)組
splice() 截取部分創(chuàng)建新數(shù)組鸿染,splice()第一個參數(shù)是開始的索引,第二個參數(shù)是截取的個數(shù)乞巧,必須是數(shù)組涨椒,可以為0,只傳一個參數(shù)是從開始到數(shù)組結(jié)束的位置绽媒。還有第三個參數(shù)蚕冬,第二個以后都是要添加到數(shù)組的新元素。返回值為新數(shù)組
2.4 可變函數(shù)(會直接改變原數(shù)組的方法)
2.4.1 添加元素
將一個元素添加到數(shù)組末尾 push()返回值為添加的元素
將一個元素添加到數(shù)組開頭 unshift()可以一次性添加多個元素是辕。?返回值為添加的元素
2.4.2 刪除元素
從末尾刪除一個元素 pop()返回值為刪除的元素
從開頭刪除一個元素shift()返回值為刪除的元素
2.4.3 為數(shù)組排序
reverse() 數(shù)組順序翻轉(zhuǎn)囤热。字符串使用sort()會改變原數(shù)組,返回改變后的數(shù)組获三。
2.5 為迭代器方法
2.5.1??不生成新數(shù)組?
forEach()forEach 中間不能停止旁蔼,寫判斷符合條件后禁止是不生效的后面還會繼續(xù)執(zhí)行锨苏。不會改變原數(shù)組,也沒有返回值牌芋。 函數(shù)沒有返回值就是undefined z
every()接受返回布爾值的函數(shù)蚓炬,所有為真則為真松逊。
some() 接受布爾值函數(shù)躺屁,一個為真就為真。
reduce()接收一個函數(shù)经宏,返回一個值犀暑,可以用來求和。還可以將數(shù)組的元素連成一個長的字符串烁兰。
reduce(add) 是數(shù)字
reduce(add)
function add (total,current) {
????return total + cuttent
}?
function concat (string,current) {
????return string + cuttent
}?
2.5.2? 生成新數(shù)組?
map()和forEach()類似耐亏,map返回新數(shù)組.不改變原數(shù)組
filter() 和every()類似,filter() 返回一個新數(shù)組沪斟,不改變原數(shù)組
2.6? 二維和多維數(shù)組
二維數(shù)組是一種類似由行和列構(gòu)成的數(shù)據(jù)表格广辰。在js中創(chuàng)建二維數(shù)組,需要先創(chuàng)建一個數(shù)組主之,然后讓數(shù)組中的每一個元素也是一個數(shù)組择吊。
var twoArr = [];
var rows = 5;
for(let i=0;i<rows;++i) {
????twoArr[i] = [];
}
Array.matrix = function (numrows,numcols,initial) {
var arr = [];
????for(var i =0;i<numrows;++i) {
? ? ? ? var columns = [];
? ? ? ? for(var j =0;j<numcols;++j) {
? ? ? ? ? ? columns[j] = initial;
????????}
????arr[i] = columns;
????}
return arr;
}
var nums = Array.matrix(5,5,0)