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)了選擇排序
?????? // 選擇排序和冒泡排序思想上有些相近
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)載請注明出處。