js演算法題
<script>
varpeachCount=getPeachOfDay(1)
console.log("第一天共有桃子數:",peachCount)
functiongetPeachOfDay(day){
if(day==10){
return1;
}
return(getPeachOfDay(day+1)+1)*2;
}
</script>
答案:1534
附::猴子吃桃問題
猴子第一天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第十天早上在想吃時,就只剩一個桃子了。求第一天共摘了多少個桃子?
❷ js演算法題,不知道該怎麼寫,希望大神能出來幫忙解答下
(function(){
functiontest(x){
lety;
for(y=0;y<=255;y++){
if(parseInt(x+""+y)%97==1){
break;
}
}
returny
}
functionrandom(min,max){
letn=max-min老亮+1
returnMath.ceil((Math.random()*n))-1+孝含伍min
}
letx=random(0,999999)
return巧或parseInt(String(x)+String(test(x)))%97===1&&0<=test(x)&&test(x)<=255
})()
x是一個隨機數,要求x 和 test(x) 拼接(不是相加)起來的數字處以97剛好餘1,並且test(x)大於等於0小於等於255
❸ 前端演算法入門一:刷演算法題常用的JS基礎掃盲
此篇屬於前端演算法入門系列的第一篇,主要介紹常用的 數組方法 、 字元串方法 、 遍歷方法 、 高階函數 、 正則表達式 以及相關 數學知識 。
在尾部追加,類似於壓棧,原數組會變。
在尾部彈出,類似於出棧,原數組會變。數組的 push & pop 可以模擬常見數據結構之一:棧。
在頭部壓入數據,類似於入隊,原數組會變。
在頭部彈出數據,原數組會變。數組的 push(入隊) & shift(出隊) 可以模擬常見數據結構之一:隊列。
concat會在當前數組尾部拼接傳入的數組,然後返回一個新數組,原數組不變。
在數組中尋找該值,找到則返回其下標,找不到則返回-1。
在數組中尋找該值,找到則返回true,找不到則返回false。
將數組轉化成字元串,並返回該字元串,不傳值則默認逗號隔開,原數組不變。
翻轉原數組,並返回已完成翻轉的數組,原數組改變。
從start 開始截取到end,但是不包括end
可參考 MDN:Sort
將數組轉化成字元串,並返回該字元串,逗號隔開,原數組不變。
返回指定索引位置處的字元。類似於數組用中括弧獲取相應下標位置的數據。
類似數組的concat(),用來返回一個合並拼接兩個或兩個以上字元串。原字元串不變。
indexOf,返回一個字元在字元串中首次出現的位置,lastIndexOf返回一個字元在字元串中最後一次出現的位置。
提取字元串的片斷,並把提取的字元串作為新的字元串返回出來。原字元串不變。
使用指定的分隔符將一個字元串拆分為多個子字元串數組並返回,原字元串不變。
match()方法可在字元串內檢索指定的值,或找到一個或多個正則表達式的匹配,並返回一個包含該搜索結果的數組。
注意事項 :如果match方法沒有找到匹配,將返回null。如果找到匹配,則 match方法會把匹配到以數組形式返回,如果正則規則未設置全局修飾符g,則 match方法返回的數組有兩個特性:input和index。input屬性包含整個被搜索的字元串。index屬性包含了在整個被搜索字元串中匹配的子字元串的位置。
replace接收兩個參數,參數一是需要替換掉的字元或者一個正則的匹配規則,參數二,需要替換進去的字元,仔實際的原理當中,參數二,你可以換成一個回調函數。
在目標字元串中搜索與正則規則相匹配的字元,搜索到,則返回第一個匹配項在目標字元串當中的位置,沒有搜索到則返回一個-1。
toLowerCase把字母轉換成小寫,toUpperCase()則是把字母轉換成大寫。
includes、startsWith、endsWith,es6的新增方法,includes 用來檢測目標字元串對象是否包含某個字元,返回一個布爾值,startsWith用來檢測當前字元是否是目標字元串的起始部分,相對的endwith是用來檢測是否是目標字元串的結尾部分。
返回一個新的字元串對象,新字元串等於重復了指定次數的原始字元串。接收一個參數,就是指定重復的次數。原字元串不變。
最常用的for循環,經常用的數組遍歷,也可以遍歷字元串。
while、do while主要的功能是,當滿足while後邊所跟的條件時,來執行相關業務。這兩個的區別是,while會先判斷是否滿足條件,然後再去執行花括弧裡面的任務,而do while則是先執行一次花括弧中的任務,再去執行while條件,判斷下次還是否再去執行do裡面的操作。也就是說 do while至少會執行一次操作 .
拷貝一份遍歷原數組。
for…of是ES6新增的方法,但是for…of不能去遍歷普通的對象, for…of的好處是可以使用break跳出循環。
面試官:說一下 for...in 和 for...of 區別?
返回一個布爾值 。當我們需要判定數組中的元素是否滿足某些條件時,可以使用every / some。這兩個的區別是,every會去判斷判斷數組中的每一項,而 some則是當某一項滿足條件時返回。
rece 從左到右將數組元素做「疊加」處理,返回一個值。receRight 從右到左。
Object.keys方法的參數是一個對象,返回一個數組。該數組的成員都是該對象自身的(而不是繼承的)所有屬性名,且只返回可枚舉的屬性。
Object.getOwnPropertyNames方法與Object.keys類似,也是接受一個對象作為參數,返回一個數組,包含了該對象自身的所有屬性名。但它能返回不可枚舉的屬性。
這里羅列一些我在刷演算法題中遇到的正則表達式,如果有時間可認真學一下正則表達式不要背。
持續更新,敬請期待……
若一個正整數無法被除了1 和它自身之外的任何自然數整除,則稱該數為質數(或素數),否則稱該正整數為合數。
持續更新,敬請期待……
作者:擺草猿
鏈接:https://juejin.cn/post/7087134135193436197
❹ JS演算法專題 - 樹的層序遍歷
先看看leetcode上的幾道題目,關鍵字 層序遍歷 ,其實就是把一棵樹一層一層地遍歷,取出每一個節點。當然從根節點到葉子節點,從葉子節點到根節點,每層從左到右,從右到左……都可以衍生成不同的題目。
102. 二叉樹的層序遍歷
107. 二叉樹的層序遍歷 II
429. N 叉樹的層序遍歷
這一類的題目,被歸納在leetcode的 廣度優先搜索 標簽下
這一類的題目,總結起來可以套用模板來解決,我們需要借用一下數據結構的知識:
隊列 :先進先出,後進後出
在JavaScript中,我們會使用 數組Array 來模擬隊列:
先初始化一個 二叉樹
先看看102的題目
解題:
從以上例子,只要步驟是:
有一個細節要注意:
這里用的是 pop() 和 unshift() ,是因為隊列先進先出的特點,pop()從最後面彈出一個元素,unshift()把新元素放到最前面。 push() 和 shift() 搭配也有相同效果。
107的題目稍微改變了一下,要求輸出是[[15,7], [9,20], [3]],可以看出,就是把102的從上到下輸出每一層節點,改成從下到上輸出,首先想到的就是把102的數組反轉就可以了。
但是,我們可能直接在保存結果數組的時候處理一下:
102中,我們使用 push() 把每一層的節點放入結果數組
107中,結果數組和102的反轉了,所以,我們可以把 push() 改成 unshift() 即可,最後得到的結果就是,樹的要節點那盯源衡層在結果數組的最後,葉子節點在最前面。
429題中把二叉樹改成了N叉樹,樹的結構發生了變化
但是可以看到,和二叉樹的數據結構相比,就是把left和right合成children,那麼在我們的模板中,也只需要修改一下
改成
這樣就可以得到結果了。
想一下,如果再改一下:如何從右到左遍歷每一層節點凱做?層數是單數時從左到右,層數是雙數時從右到左?
再擴展一下,這個演算法能做什裂做么呢?
當我們玩游戲,特別是走迷宮之類的游戲,是不是會從一個點出發,然後判斷下一步能不能走,直到找出終點?BFS也是尋路方案的基礎。
推薦一下leetcode上的總結:
二叉樹層序遍歷登場:我要打十個!
❺ js面試題
1.eventLoop
2.setTimeout 誤差原因
3.深淺拷貝
4.跨域原因及解決方案
5.css放在頭部,js放在尾部
6.css觸發bfc
7.webpack plugin和loader區別
8.前端優化
9.協商緩存
10.長列表優化
11.webview交互
12.vue響應式原理
13.原型
14.演算法題:數組中有n個元素,排列
EventLoop是計則扒沒算機系統的運行機制,js就是運行這個機制,因為js是單線程語言,所以一旦遇到一個耗時很長的任務就會卡住,js為了解決這個問題就有了EventLoop
Event Loop是一個程序結構,用於等待和發送消息和事件。
就是在程序中有了兩個線程,一個負責應用本身,主線程,另一個負責此悉主線程和其它進程,稱為EventLoop
1、js是單線程語言
基本數據類型存放在棧中的簡單數據段
引用數據類型存放在堆中的對象
因為定時器是宏任務,如果執孫納行棧的時間大於定時器花費的時間,那麼定時器的回調在 宏任務(macrotask) 里,來不及去調用,所有這個時間會有誤差。所以就會有誤差
宏任務是宿主發起的比如script,setTimeout
css放在頭部是因為頁面載入html生成dom樹的時候就可以同時對dom樹進行渲染,防止閃跳,白屏
js放在尾部是因為js會修改dom樹,需要一個穩定的dom樹
BFC是css的一個布局概念,塊級格式化上下文
浮動float不為none的時候
定位為position:absolute和fixed的
display的時候
overflow不為visible
解決浮動父元素坍塌問題
解決自適應布局的問題
解決外邊距垂直方向重合問題
loader是文件載入器,運行在nodejs中,並對文件進行打包,壓縮轉換
plugin是插件,用於拓展webpack的功能
淺拷貝有兩種定於,第一種是賦值,第二種是拷貝對象的第一層屬性,深層還是一樣的
深拷貝是指將對象拷貝一份,無論如何修改都不會改變原有的
響應式原理就是當數據發生改變的時候視圖也會跟著更新
VUE是利用了Object.defineProperty的方法裡面的setter 與getter方法的觀察者模式來實現。