web大前端復(fù)習(xí)——js常見算法題1

Q1 判斷一個(gè)單詞是否是回文才沧?

回文是指把相同的詞匯或句子成翩,在下文中調(diào)換位置或顛倒過來,產(chǎn)生首尾回環(huán)的情趣叮雳,叫做回文丈积,也叫回環(huán)。比如 mamam redivider .

很多人拿到這樣的題目非常容易想到用for 將字符串顛倒字母順序然后匹配就行了债鸡。其實(shí)重要的考察的就是對(duì)于reverse的實(shí)現(xiàn)江滨。其實(shí)我們可以利用現(xiàn)成的函數(shù),將字符串轉(zhuǎn)換成數(shù)組厌均,這個(gè)思路很重要唬滑,我們可以擁有更多的自由度去進(jìn)行字符串的一些操作。

??????? function checkPalindrom(str) {

??????????? return str == str.split('').reverse().join('');

??????? }

??????? console.log(checkPalindrom('mamam'));?? //true

??????? console.log(checkPalindrom('banana'));? //false

split() 方法用于把一個(gè)字符串分割成字符串?dāng)?shù)組棺弊。

reverse() 方法用于顛倒數(shù)組中元素的順序晶密。

join() 方法用于把數(shù)組中的所有元素放入一個(gè)字符串。元素是通過指定的分隔符進(jìn)行分隔的模她。

Q2 去掉一組整型數(shù)組重復(fù)的值

比如 輸入: [1,13,24,11,11,14,1,2]稻艰, 輸出: [1,13,24,11,14,2] ,需要去掉重復(fù)的11 和 1 這兩個(gè)元素侈净。

主要考察個(gè)人對(duì)Object的使用尊勿,利用key來進(jìn)行篩選。

let unique = function(arr) {

??????????? let hashTable = {};

??????????? let data = [];

??????????? for(let i=0,l=arr.length;i<l;i++) {

??????????????? if(!hashTable[arr[i]]) {

??????????????????? hashTable[arr[i]] = true;

??????????????????? data.push(arr[i]);

??????????????? }

??????????? }

??????????? return data

??????? }

??????? var arr=[1,13,24,11,11,14,1,2]

??????? console.log(unique(arr))??? //[1, 13, 24, 11, 14, 2]

還有一種方法 利用ES6的Set

var arr=[1,13,24,11,11,14,1,2];

let uniqueES6= function(arr){

??????????? return Array.from(new Set(arr))

??????? }

console.log(uniqueES6(arr))//[1, 13, 24, 11, 14, 2]

Q3 統(tǒng)計(jì)一個(gè)字符串出現(xiàn)最多的字母

給出一段英文連續(xù)的英文字符竄畜侦,找出重復(fù)出現(xiàn)次數(shù)最多的字母

比如: 輸入:afjghdfraaaasdenas 輸出 : a

前面出現(xiàn)過去重的算法元扔,這里需要是統(tǒng)計(jì)重復(fù)次數(shù)。

function findMaxDuplicateChar(str){

??????????? if(str.length == 1){

??????????????? return str

??????????? }

??????????? let charObj ={}

??????????? for(let i=0;i<str.length;i++){

??????????????? if(!charObj[str.charAt(i)]){

??????????????????? charObj[str.charAt(i)] = 1;

??????????????? }else{

??????????????????? charObj[str.charAt(i)] +=1;

??????????????? }

??????????? }

??????????? let maxchar = '',

??????????????? maxvalue=1;

??????????? for(var k in charObj){

??????????????? if(charObj[k] >= maxvalue){

??????????????????? maxchar =k;

??????????????????? maxvalue=charObj[k];

??????????????? }

??????????? }

??????????? return maxchar;

??????? }

??????? console.log(findMaxDuplicateChar('gffhghjllyesdfffnmfffssssffffjjffff')) //f

Q4 排序算法

如果說到算法題目的話旋膳,應(yīng)該大多都是比較開放的題目澎语,不限定算法的實(shí)現(xiàn),但是一定要求掌握其中的幾種。

冒泡排序

插入排序

快速排序

選擇排序

let arr = [4,6,32,11,5,667,39,56,78,2,42,7];

??????? /*冒泡排序*/

??????? function bubbleSort(arr){

??????????? for(var i=0;i<arr.length-1;i++){

??????????????? for(var j=0;j<arr.length-i;j++){

??????????????????? if(arr[j]>arr[j+1]){

??????????????????????? var temp = arr[j]

??????????????????????? arr[j] = arr[j+1]

??????????????????????? arr[j+1] = temp

??????????????????? }

??????????????? }

??????????? }

??????????? return arr

??????? }

??????? console.log(bubbleSort(arr))

??????? /*插入排序*/

??????? function insertionSort(array) {

??????????? console.time('插入排序耗時(shí):');

??????????? for (var i = 1; i < array.length; i++) {

??????????????? var key = array[i];

??????????????? var j = i - 1;

??????????????? while ( array[j] > key) {

??????????????????? array[j + 1] = array[j];

??????????????????? j--;

??????????????? }

??????????????? array[j + 1] = key;

??????????? }

??????????? console.timeEnd('插入排序耗時(shí):');

??????????? return array;

??????? }

??????? console.log(insertionSort(arr));

??????? /*快速排序*/

??????? function quickSort(arr){

??????????? //如果數(shù)組<=1,則直接返回

??????????? if(arr.length<=1){return arr;}

??????????? var pivotIndex=Math.floor(arr.length/2);

??????????? //找基準(zhǔn)擅羞,并把基準(zhǔn)從原數(shù)組刪除

??????????? var pivot=arr.splice(pivotIndex,1)[0];

??????????? //定義左右數(shù)組

??????????? var left=[];

??????????? var right=[];

??????????? //比基準(zhǔn)小的放在left尸变,比基準(zhǔn)大的放在right

??????????? for(var i=0;i<arr.length;i++){

??????????????? if(arr[i]<=pivot){

??????????????????? left.push(arr[i]);

??????????????? }

??????????????? else{

??????????????????? right.push(arr[i]);

??????????????? }

??????????? }

??????????? //遞歸

??????????? return quickSort(left).concat([pivot],quickSort(right));

??????? }

??????? console.log(quickSort(arr))

??????? // 選擇排序

??????? var arr = [8,3,9,12,45,23,4,89,48,63,27,53,56,98]

??????? function selectSort(arr){

??????????? var len = arr.length

??????????? for(var i= 0;i<len-1;i++){

??????????????? for(var j = i+1;j<len;j++){

??????????????????? if(arr[i]>arr[j]){

??????????????????????? var temp = arr[i]

??????????????????????? arr[i] = arr[j]

??????????????????????? arr[j] = temp

??????????????????? }

??????????????? }

??????????? }

??????????? return arr

??????? }

??????? console.log(selectSort(arr))

??????? // 選擇排序的思想是:把每一個(gè)數(shù)都與第一個(gè)數(shù)比較,如果小于第一個(gè)數(shù)减俏,就把它們交換位置召烂;這樣一輪下來,最小的數(shù)就排到了最前面垄懂;重復(fù)n-1輪,就實(shí)現(xiàn)了選擇排序

?????? // 選擇排序和冒泡排序思想上有些相近

十大經(jīng)典排序算法總結(jié)(java代碼)

Q5 不借助臨時(shí)變量痛垛,進(jìn)行兩個(gè)整數(shù)的交換

舉例:輸入 a = 2, b = 4 輸出 a = 4, b =2

這種問題非常巧妙草慧,需要大家跳出慣有的思維,利用 a , b進(jìn)行置換匙头。

主要是利用 + - 去進(jìn)行運(yùn)算漫谷,類似 a = a + ( b - a) 實(shí)際上等同于最后 的 a = b;

??????? let a=2 ,b=4

??????? function swap(a , b) {

??????????? b = b - a;

??????????? a = a + b;

??????????? b = a - b;

??????????? return [a,b];

??????? }

??????? console.log(swap(a , b));

Q6 使用canvas 繪制一個(gè)有限度的斐波那契數(shù)列的曲線

斐波那契數(shù)列曲線

數(shù)列長(zhǎng)度限定在10.

斐波那契數(shù)列,又稱黃金分割數(shù)列蹂析,指的是這樣一個(gè)數(shù)列:0舔示、1、1电抚、2惕稻、3、5蝙叛、8俺祠、13、21借帘、34蜘渣、……在數(shù)學(xué)上,斐波納契數(shù)列主要考察遞歸的調(diào)用肺然。我們一般都知道定義

fibo[i] = fibo[i-1]+fibo[i-2];

var canvas = document.querySelector('canvas');

??????? canvas.width = 600;

??????? canvas.height = 480;

??????? var coor = {

??????????? x: 300,

??????????? y: 240,

??????? };

??????? var ctx = canvas.getContext('2d');

??????? function draw(r, n ,prevR) {

??????????? if(n>2) {

??????????????? switch(n%4) {

??????????????????? case 0 :

??????????????????????? coor.y = coor.y - 5 * prevR;

??????????????????????? coor.y = coor.y + 5 * r;

??????????????????????? break;

??????????????????? case 1 :

??????????????????????? coor.x = coor.x + 5 * prevR;

??????????????????????? coor.x = coor.x - 5 * r;

??????????????????????? break;

??????????????????? case 2 :

??????????????????????? coor.y = coor.y + 5 * prevR;

??????????????????????? coor.y = coor.y - 5 * r;

??????????????????????? break;

??????????????????? case 3 :

??????????????????????? coor.x = coor.x - 5 * prevR;

??????????????????????? coor.x = coor.x + 5 * r;

??????????????????????? break;

??????????????? }

??????????? }

??????????? ctx.beginPath();

??????????? ctx.arc(coor.x,coor.y,5*r,Math.PI*0.5*(n),Math.PI*0.5*(n-1),true);

??????????? if(n>1) {

??????????????? switch(n%4) {

??????????????????? case 0 :

??????????????????????? ctx.moveTo(coor.x - 5*r,coor.y);

??????????????????????? break;

??????????????????? case 1 :

??????????????????????? ctx.moveTo(coor.x,coor.y + 5*r);

??????????????????????? break;

??????????????????? case 2 :

??????????????????????? ctx.moveTo(coor.x + 5*r,coor.y);

??????????????????????? break;

??????????????????? case 3 :

??????????????????????? ctx.moveTo(coor.x,coor.y-5*r);

??????????????????????? break;

??????????????? }

??????????? }

??????????? ctx.lineWidth = 1;

??????????? ctx.strokeStyle = '#fff';

??????????? ctx.stroke();

??????? }

??????? /*生成斐波那契數(shù)組的方法*/

??????? function getFibonacci(n) {

??????????? var fibarr = [];

??????????? var i = 0;

??????????? while(i<n) {

??????????????? if(i<=1) {

??????????????????? fibarr.push(i);

??????????????? }else{

??????????????????? fibarr.push(fibarr[i-1] + fibarr[i-2])

??????????????? }

??????????????? i++;

??????????? }

??????????? return fibarr;

??????? }

??????? console.log(getFibonacci(10))? //[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

??????? var data = getFibonacci(10);

??????? for(var i = 0,l=data.length;i<l;i++) {

??????????? if(data[i]!=0) {

??????????????? draw(data[i],i,data[i-1]);

??????????? }

??????? }

Q7 找出下列正數(shù)組的最大差值

比如: 輸入 [10,5,11,7,8,9] 輸出 6

這是通過一道題目去測(cè)試對(duì)于基本的數(shù)組的最大值的查找蔫缸,很明顯我們知道,最大差值肯定是一個(gè)數(shù)組中最大值與最小值的差际起。

??????? var arr = [16,5,111,7,21,9]

??????? function getMaxProfit(arr) {

??????????? const item1 = Math.max.apply( null, arr );

??????????? const item2 = Math.min.apply( null, arr );

??????????? return item1 - item2;

??????? }

??????? console.log(getMaxProfit(arr)) //106

ES6的方法

??????? var arr = [16,5,111,7,21,9]

??????? //ES6

??????? function getMaxProfitES6(arr){

??????????? const item1 = Math.max(...arr);

??????????? const item2 = Math.min(...arr);

??????????? return item1 - item2;

??????? }

??????? console.log(getMaxProfitES6(arr));

Q8 隨機(jī)生成指定長(zhǎng)度的字符串

實(shí)現(xiàn)一個(gè)算法拾碌,隨機(jī)生成指制定長(zhǎng)度的字符竄。

比如:給定 長(zhǎng)度 8 輸出 4ldkfg9j

??????? function randomString(n) {

??????????? let str = 'abcdefghijklmnopqrstuvwxyz9876543210';

??????????? let tmp = '',

??????????????? l = str.length;

??????????? for (let i = 0; i < n; i++) {

??????????????? tmp += str.charAt(Math.floor(Math.random() * l));

??????????? }

??????????? return tmp;

??????? }

??????? console.log(randomString(8))

Q9 計(jì)算一個(gè)整數(shù)的階乘

??????? function factorialize(num) {

??????????? if(num<1){

??????????????? return 1;

??????????? }else{

??????????????? return num*factorialize(num-1);

??????????? }

??????? }

??????? console.log(factorialize(5));?? //120

Q10 找到提供的句子中最長(zhǎng)的單詞街望,并計(jì)算它的長(zhǎng)度

??????? function findLongestWord(str) {

??????????? //轉(zhuǎn)化成數(shù)組

??????????? var astr=str.split( " " );

??????????? //對(duì)數(shù)組中每個(gè)元素的字符串長(zhǎng)度進(jìn)行比較倦沧,按照字符串長(zhǎng)度由大至小排列數(shù)組順序。

??????????? var bstr=astr.sort(function(a,b){

??????????????? return b.length-a.length;

??????????? });

??????????? //取出數(shù)組中第一個(gè)元素(也就是最大長(zhǎng)度的字符串)

??????????? console.log(bstr[0])?????? //jumped

??????????? var lenMax= bstr[0].length;

??????????? //返回長(zhǎng)度值

??????????? return lenMax;

??????? }

??????? console.log(findLongestWord("The quick brown fox jumped over the lazy dog"));//6

array.sort()方法默認(rèn)是升序排序它匕,如果想按照其他標(biāo)準(zhǔn)進(jìn)行排序展融,就需要提供比較函數(shù),該函數(shù)要比較兩個(gè)值,然后返回一個(gè)用于說明這兩個(gè)值的相對(duì)順序的數(shù)字告希。比較函數(shù)應(yīng)該具有兩個(gè)參數(shù) a 和 b扑浸,其返回值如下:

若 a 小于 b,在排序后的數(shù)組中 a 應(yīng)該出現(xiàn)在 b 之前燕偶,則返回一個(gè)小于 0 的值喝噪。

若 a 等于 b,則返回 0指么。

若 a 大于 b酝惧,則返回一個(gè)大于 0 的值。

簡(jiǎn)單點(diǎn):比較函數(shù)兩個(gè)參數(shù)a和b伯诬,返回a-b升序晚唇,返回b-a降序

Q11 確保字符串的每個(gè)單詞首字母都大寫,其余部分小寫盗似。

??????? function titleCase(str) {

??????????? var astr=str.toLowerCase().split(" ");

??????????? for(var i=0 ; i<astr.length; i++){

??????????????? astr[i]=astr[i][0].toUpperCase()+astr[i].substring(1,astr[i].length);

??????????? }

??????????? var string=astr.join(" ");

??????????? return string;

??????? }

??????? console.log(titleCase("I'm a little tea pot"));//結(jié)果:I'm A Little Tea Pot

Q12 找出4個(gè)小數(shù)組中最大值哩陕,組成一個(gè)新數(shù)組

??????? function largestOfFour(arr) {

??????????? var newArr=[];

??????????? for(i=0;i<arr.length;i++){

??????????????? arr[i].sort(function(a,b){

??????????????????? return b-a;

??????????????? });

??????????????? newArr.push(arr[i][0]);

??????????? }

??????????? return newArr;

??????? }

??????? console.log(largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]));?? //[5,27,39,1001]

Q13 比較兩個(gè)數(shù)組,然后返回一個(gè)新數(shù)組赫舒,該數(shù)組的元素為兩個(gè)給定數(shù)組中所有獨(dú)有的數(shù)組元素悍及。換言之,返回兩個(gè)數(shù)組的差異接癌。

方法一:

??????? function diff(arr1, arr2) {

??????????? var newArr = [];

??????????? //過濾數(shù)組1中與數(shù)組2相等的項(xiàng)

??????????? var arr1Filtered=arr1.filter(function(num){

??????????????? for(var i=0; i<arr2.length; i++){

??????????????????? if(num==arr2[i]){

??????????????????????? return false;

??????????????????? }

??????????????? }

??????????????? return true;

??????????? });

??????????? //過濾數(shù)組2中與數(shù)組1相等的項(xiàng)

??????????? var arr2Filtered=arr2.filter(function(num){

??????????????? for(var i=0; i<arr1.length; i++){

??????????????????? if(num==arr1[i]){

??????????????????????? return false;

??????????????????? }

??????????????? }

??????????????? return true;

??????????? });

??????????? //連接兩個(gè)數(shù)組

??????????? newArr=arr1Filtered.concat(arr2Filtered);

??????????? return newArr;

??????? }

??????? var arr1 = [1, "calf", 3, "piglet"],

??????????? arr2 = [1, "calf", 3, 4]

??????? console.log(diff(arr1, arr2));? // ["piglet", 4]

方法二:

??????? var arr1 = [1, "calf", 3, "piglet"],

??????? arr2 = [1, "calf", 3, 4]

??????? function fn(arr1,arr2){

??????????? var newArr = []

??????????? var arr1Filtered = arr1.filter(function(num){

??????????????? if(arr2.indexOf(num)!=-1){

??????????????????? return false

??????????????? }

??????????????? return true

??????????? })

??????????? var arr2Filtered = arr2.filter(function(num){

??????????????? if(arr1.indexOf(num)!=-1){

??????????????????? return false

??????????????? }

??????????????? return true

??????????? })

??????????? return arr1Filtered.concat(arr2Filtered)

??????? }

??????? console.log(fn(arr1,arr2))

Q14 寫一個(gè) function心赶,傳入兩個(gè)或兩個(gè)以上的數(shù)組,返回一個(gè)以給定的原始數(shù)組排序的不包含重復(fù)值的新數(shù)組缺猛。

說明:所有數(shù)組中的所有值都應(yīng)該以原始順序被包含在內(nèi)园担,但是在最終的數(shù)組中不包含重復(fù)值。

如:unite([1, 3, 2], [5, 2, 1, 4], [2, 1]) 應(yīng)該返回 [1, 3, 2, 5, 4]枯夜。

unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]) 應(yīng)該返回 [1, 2, 3, 5, 4, 6, 7, 8]弯汰。

方法一:

??????? function unite(arr1, arr2, arr3) {

??????????? for(var j=1; j<arguments.length; j++){

??????????????? //過濾掉第j個(gè)數(shù)組中已經(jīng)在前面出現(xiàn)過的值

??????????????? var filteredArr=arguments[j].filter(function(num){

??????????????????? for(var i=0; i<arr1.length; i++){

??????????????????????? if(arr1[i]==num){

??????????????????????????? return false;

??????????????????????? }

??????????????????? }

??????????????????? return true;

??????????????? });

??????????????? arr1=arr1.concat(filteredArr);

??????????? }

??????????? return arr1;

??????? }

??????? console.log(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8])); //[1,2,3,5,4,6,7,8]

方法二:

??????? function unite(){

??????????? var arr = arguments[0]

??????????? for(let i = 0;i<arguments.length;i++){

??????????????? var filterArr = arguments[i].filter(function(num){

??????????????????? if(arr.indexOf(num)!=-1){

??????????????????????? return false

??????????????????? }

??????????????????? return true

??????????????? })

??????????????? arr= arr.concat(filterArr)

??????????? }

??????????? return arr

??????? }

??????? console.log(unite([1, 2, 3], [5, 2, 1, 4], [2, 1], [6, 7, 8]));

Q15 求小于等于給定數(shù)值的質(zhì)數(shù)(素?cái)?shù))之和。

說明:只有 1 和它本身兩個(gè)約數(shù)的數(shù)叫質(zhì)數(shù)湖雹。例如咏闪,2 是質(zhì)數(shù),因?yàn)樗荒鼙?1 和 2 整除摔吏。1 不是質(zhì)數(shù)鸽嫂,因?yàn)樗荒鼙蛔陨碚=o定的數(shù)不一定是質(zhì)數(shù)征讲。

如:sumPrimes(10) 應(yīng)該返回 17据某。

??????? function sumPrimes(num) {

??????????? //將所有小于等于num的質(zhì)數(shù)放進(jìn)一個(gè)數(shù)組

??????????? var arr=[];

??????????? //1不是質(zhì)數(shù),從2開始循環(huán)诗箍,需算上num

??????????? for(var i=2; i<=num; i++){

??????????????? var j=2;

??????????????? //判斷i能否被從2開始的數(shù)整除

??????????????? while(i%j!==0){

??????????????????? j++;

??????????????? }

??????????????? //判斷這個(gè)數(shù)是不是自身癣籽,是則加進(jìn)數(shù)組

??????????????? if(i==j){

??????????????????? arr.push(i);

??????????????? }

??????????? }

??????????? //對(duì)數(shù)組求和

??????????? var result=arr.reduce(function (a,b){return a+b;});

??????????? return result;

??????? }

??????? console.log(sumPrimes(10))? ///17

reduce() 方法接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值(從左到右)開始縮減,最終計(jì)算為一個(gè)值筷狼。

reduce() 可以作為一個(gè)高階函數(shù)瓶籽,用于函數(shù)的 compose。

注意: reduce() 對(duì)于空數(shù)組是不會(huì)執(zhí)行回調(diào)函數(shù)的埂材。

另外一種寫法

??????? function sumFun(num){

????????? let sum=0

????????? for(let i=2;i<=num;i++){

??????????? var j= 2

??????????? while(i%j !==0){

????????????? j++

??????????? }

??????????? if(j==i){

????????????? sum+=j

??????????? }

????????? }

????????? return sum

??????? }

??????? console.log(sumFun(11)) //18

方法三

??? function getPrimes(n){

??????? var arr = []

??????? for(var i=2;i<=n;i++){

??????????? var flag = true

??????????? for(var j = 2;j<=Math.sqrt(i);j++){

??????????????? if(i%j==0){

??????????????????? flag = false

??????????????????? break

??????????????? }

??????????? }

??????????? if(flag){

??????????????? arr.push(i)

??????????? }

??????? }

??????? //對(duì)數(shù)組求和

??????? var result=arr.reduce(function (a,b){return a+b;});

??????? return result

??? }

方法四

??? function getPrimes(n){

??????? var prime = []

??????? var arr = []

??????? for(var i = 2;i<=n;i++){

??????????? if(!prime[i]){

??????????????? arr.push(i)

??????????????? for (var j = i; j*i <=n; j++) {

??????????????????? prime[j*i]=true;

??????????????? }

??????????? }

??????? }

??????? //對(duì)數(shù)組求和

??????? var result=arr.reduce(function (a,b){return a+b;});

??????? return result

??? }

Q16 寫一個(gè) function塑顺,它瀏覽數(shù)組(第一個(gè)參數(shù))并返回?cái)?shù)組中第一個(gè)通過某種方法(第二個(gè)參數(shù))驗(yàn)證的元素。

如:find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; }) 應(yīng)該返回 8俏险。

find([1, 3, 5, 9], function(num) { return num % 2 === 0; }) 應(yīng)該返回 undefined严拒。

??????? function find(arr, func) {

??????????? var newArr=arr.filter(func);

??????????? return newArr[0];

??????? }

??????? console.log(find([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; })) //8

Q17 對(duì)嵌套的數(shù)組進(jìn)行扁平化處理。你必須考慮到不同層級(jí)的嵌套竖独。

如:steamroller([1, [2], [3, [[4]]]]) 應(yīng)該返回 [1, 2, 3, 4]裤唠。

steamroller([1, [], [3, [[4]]]]) 應(yīng)該返回 [1, 3, 4]。

steamroller([1, {}, [3, [[4]]]]) 應(yīng)該返回 [1, {}, 3, 4]预鬓。

1巧骚、

??????? function steamroller(arr) {

??????????? var newArr=[];

??????????? for(var i=0; i<arr.length; i++){

??????????????? if(!Array.isArray(arr[i])){

??????????????????? newArr.push(arr[i]);

??????????????? }else{

??????????????????? newArr=newArr.concat(steamroller(arr[i]));

??????????????? }

??????????? }

??????????? return newArr;

??????? }

??????? console.log(steamroller([1, {}, [3, [[4]]]]))?? //[1, {}, 3, 4]

此題的解法是在一個(gè)for循環(huán)中使用了遞歸赊颠,在for循環(huán)中使用遞歸時(shí)格二,不會(huì)影響for循環(huán)的進(jìn)程。

2竣蹦、另外一種方法:

????? function flatten(arr){

??????? while(arr.some(item=>Array.isArray(item))){

????????? arr = [].concat(...arr)

??????? }

??????? return arr;

????? }

????? console.log(flatten([1, {}, [3, [[4]]]]));//[1, 2, 3]

some() 方法用于檢測(cè)數(shù)組中的元素是否滿足指定條件(函數(shù)提供)顶猜。

some() 方法會(huì)依次執(zhí)行數(shù)組的每個(gè)元素:

如果有一個(gè)元素滿足條件,則表達(dá)式返回true , 剩余的元素不會(huì)再執(zhí)行檢測(cè)痘括。

如果沒有滿足條件的元素长窄,則返回false。

注意:some() 不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)纲菌。

注意:some() 不會(huì)改變?cè)紨?shù)組挠日。

3、es6新增的數(shù)組實(shí)例方法flat()

[1, 2, [3, 4]].flat()

// [1, 2, 3, 4]

flat()默認(rèn)只會(huì)“拉平”一層翰舌,如果想要“拉平”多層的嵌套數(shù)組嚣潜,可以將flat()方法的參數(shù)寫成一個(gè)整數(shù),表示想要拉平的層數(shù)椅贱,默認(rèn)為1懂算。

[1, 2, [3, [4, 5]]].flat()

// [1, 2, 3, [4, 5]]

[1, 2, [3, [4, 5]]].flat(2)

// [1, 2, 3, 4, 5]

如果不管有多少層嵌套,都要轉(zhuǎn)成一維數(shù)組庇麦,可以用Infinity關(guān)鍵字作為參數(shù)计技。

[1, [2, [3]]].flat(Infinity)

// [1, 2, 3]

如果原數(shù)組有空位,flat()方法會(huì)跳過空位山橄。

[1, 2, , 4, 5].flat()

// [1, 2, 4, 5]

4垮媒、如果數(shù)組中元素都是字符串,可以利用數(shù)組toString()方法

例如:['a',[b],c,[[d],e,[f,[g,h]]]]

?? var arr= ['a',[`b`],`c`,[[`d`],`e`,[`f`,[`g`,`h`]]]]

?? console.log(arr.toString().split(','))

Q18 二分查找

??????? function binary_search(arr, key) {

??????????? var low = 0,

??????????????? high = arr.length - 1;

??????????? while(low <= high){

??????????????? var mid = parseInt((high + low) / 2);

??????????????? if(key == arr[mid]){

??????????????????? return? mid;

??????????????? }else if(key > arr[mid]){

??????????????????? low = mid + 1;

??????????????? }else if(key < arr[mid]){

??????????????????? high = mid -1;

??????????????? }

??????????? }

??????????? return -1;

??????? };

??????? var arr=[2,4,6,9,11,25,28,36,44,47,67,76,79],

??????????? key=36;

??????? console.log(binary_search(arr,key)) //7

因?yàn)槎植檎颐看闻懦粢话氲牟贿m合值,所以對(duì)于n個(gè)元素的情況:

一次二分剩下:n/2

兩次二分剩下:n/2/2 = n/4

……

m次二分剩下:n/(2^m)

在最壞情況下是在排除到只剩下最后一個(gè)值之后得到結(jié)果涣澡,所以為

n/(2^m)=1;

2^m=n;

所以時(shí)間復(fù)雜度為:log2(n)

作者:指尖跳動(dòng)

鏈接:https://www.jianshu.com/p/2f38ac50c63a

來源:簡(jiǎn)書

著作權(quán)歸作者所有贱呐。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處入桂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奄薇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子抗愁,更是在濱河造成了極大的恐慌馁蒂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜘腌,死亡現(xiàn)場(chǎng)離奇詭異沫屡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撮珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門沮脖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芯急,你說我怎么就攤上這事勺届。” “怎么了娶耍?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵免姿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我榕酒,道長(zhǎng)胚膊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任想鹰,我火速辦了婚禮紊婉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辑舷。我一直安慰自己喻犁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布惩妇。 她就那樣靜靜地躺著株汉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歌殃。 梳的紋絲不亂的頭發(fā)上乔妈,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音氓皱,去河邊找鬼路召。 笑死勃刨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的股淡。 我是一名探鬼主播身隐,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唯灵!你這毒婦竟也來了贾铝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤埠帕,失蹤者是張志新(化名)和其女友劉穎垢揩,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敛瓷,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叁巨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呐籽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锋勺。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狡蝶,靈堂內(nèi)的尸體忽然破棺而出庶橱,到底是詐尸還是另有隱情,我是刑警寧澤牢酵,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布悬包,位于F島的核電站衙猪,受9級(jí)特大地震影響馍乙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垫释,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一丝格、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棵譬,春花似錦显蝌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脏嚷,卻和暖如春骆撇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背父叙。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工神郊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肴裙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓涌乳,卻偏偏與公主長(zhǎng)得像蜻懦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夕晓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容