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

Q1 判斷一個單詞是否是回文?

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

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

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

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

??????? }

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

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

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

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

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

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

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

主要考察個人對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ì)一個字符串出現(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('插入排序耗時:');

??????????? 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('插入排序耗時:');

??????????? 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))

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

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

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

Q5 不借助臨時變量,進(jìn)行兩個整數(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 繪制一個有限度的斐波那契數(shù)列的曲線

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

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

斐波那契數(shù)列,又稱黃金分割數(shù)列,指的是這樣一個數(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

這是通過一道題目去測試對于基本的數(shù)組的最大值的查找,很明顯我們知道,最大差值肯定是一個數(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ī)生成指定長度的字符串

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

比如:給定 長度 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ì)算一個整數(shù)的階乘

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

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

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

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

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

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

??????? }

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

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

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

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

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

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

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

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

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

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

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

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

??????????? //返回長度值

??????????? 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ù)要比較兩個值,然后返回一個用于說明這兩個值的相對順序的數(shù)字。比較函數(shù)應(yīng)該具有兩個參數(shù) a 和 b,其返回值如下:

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

若 a 等于 b,則返回 0。

若 a 大于 b,則返回一個大于 0 的值。

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

Q11 確保字符串的每個單詞首字母都大寫,其余部分小寫。

??????? 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個小數(shù)組中最大值,組成一個新數(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 比較兩個數(shù)組,然后返回一個新數(shù)組,該數(shù)組的元素為兩個給定數(shù)組中所有獨(dú)有的數(shù)組元素。換言之,返回兩個數(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;

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

??????????? //連接兩個數(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 寫一個 function,傳入兩個或兩個以上的數(shù)組,返回一個以給定的原始數(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個數(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 和它本身兩個約數(shù)的數(shù)叫質(zhì)數(shù)。例如,2 是質(zhì)數(shù),因?yàn)樗荒鼙?1 和 2 整除。1 不是質(zhì)數(shù),因?yàn)樗荒鼙蛔陨碚?。給定的數(shù)不一定是質(zhì)數(shù)。

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

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

??????????? //將所有小于等于num的質(zhì)數(shù)放進(jìn)一個數(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++;

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

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

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

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

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

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

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

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

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

??????? }

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

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

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

注意: reduce() 對于空數(shù)組是不會執(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)

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

??????? }

??????? //對數(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;

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

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

??????? }

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

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

??????? return result

??? }

Q16 寫一個 function,它瀏覽數(shù)組(第一個參數(shù))并返回?cái)?shù)組中第一個通過某種方法(第二個參數(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 對嵌套的數(shù)組進(jìn)行扁平化處理。你必須考慮到不同層級的嵌套。

如: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]

此題的解法是在一個for循環(huán)中使用了遞歸,在for循環(huán)中使用遞歸時,不會影響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() 方法用于檢測數(shù)組中的元素是否滿足指定條件(函數(shù)提供)。

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

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

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

注意:some() 不會對空數(shù)組進(jìn)行檢測。

注意:some() 不會改變原始數(shù)組。

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

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

// [1, 2, 3, 4]

flat()默認(rèn)只會“拉平”一層,如果想要“拉平”多層的嵌套數(shù)組,可以將flat()方法的參數(shù)寫成一個整數(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()方法會跳過空位。

[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合值,所以對于n個元素的情況:

一次二分剩下:n/2

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

……

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

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

n/(2^m)=1;

2^m=n;

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

作者:指尖跳動

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

來源:簡書

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容