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