JavaScript面试题之代码篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript面试题之代码篇相关的知识,希望对你有一定的参考价值。

数组翻转的两种方法

  • 方法一:创建一个新数组,将原数组从后面添加到新数组的前面,实现翻转
var arr = [1,2,3,4,5,6] ;    //待翻转数组var newArr = [] ;        //用来接收翻转之后的数组for(var i=0 ; i<arr.length-1-i ; i++){

    newArr[newArr.length] = arr[arr.length-1-i] ;

};

console.log(newArr) ;      //[8,7,6,5,4,3,2,1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

解析:newArr[newArr.length] = arr[arr.length-1-i] 的作用是将原数组从后面挨个提取出来然后放到新数组中。arr[arr.length-1-i] 减1是因为length是从1算起而数组下标是从0算起所以减1的话arr.length-1的结果就是数组的下表的最大值;减i的原因是当把原数组的倒数第二个提取出来放到新数组的正数第二个里面这是不能再是arr[arr.length-1],在for循环的第二轮刚好是把原数组的倒数第二个提取出来放到新数组的正数第二个所以用减i可以达到目的。

  • 方法二:用for循环将数组的前后对称的元素互换位置
var arr = [1,2,3,4,5,6];
for( var i=0 ; i<arr.length/2 ; i++ ){
    var temp = arr[i] ;
    arr[i] = arr[arr.length-1-i] ;
    arr[arr.length-1-i] = temp ;
};
console.log( arr ) ;   //[6,5,4,3,2,1]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

解析:最后一个和第一个换位置,倒数第二个和正数第二个换位置,如果数组是奇数则让则让for循环的条件小于arr.length/2 , 如果是偶数也让for循环的条件小于arr.length/2因为等于的话会把数组最中间的两个数重复对调两次也就是说相当于没有对调。temp变量的作用是充当交换数组前后两个元素时的中间量;

求阶乘

  • 阶乘:5的阶乘=5*4*3*2*1
function mul( n ){var sum = 1 ;
  for(var i=1 ; i<=n ; i++){
    sum *= i ;
  } ;
  return sum ;
} ;

console.log( mul(4) ) ;      //24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

求阶乘的和

  • 阶乘的和:1! + 2! + 3! + 4! + 5!
function mul( n ){var sum = 1 ;
  for(var i=1 ; i<=n ; i++){
    sum *= i ;
  } ;
  return sum ;
} ;

function sumMul(n){var sum = 0 ;
  for(var i=1 ; i<=n ; i++){
    sum += mul(i) ;
  }
  return sum ;
} ;

console.log( sumMul(4) ) ;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

冒泡排序

  • 将数组里的值由小到大排列
function bubol(arr){for( var i=0 ; i<arr.length-1 ; i++ ){
    //作为一个哨兵变量,如果执行下面的程序进入if了说明数组顺序没排好,不能跳出程序,还要继续比较//如果给定的数组是由大到小的,那么不会进入if所以bul是true就可以return出数组了,//因为该数组本身就是由大到小的不需要再进行第二轮判断var bul = true ;   
    for( var j=0 ; j<arr.length-1 ; j++ ){
      if( arr[j] > arr[j+1] ){
        var temp = arr[j] ;
        arr[j] = arr[j+1] ;
        arr[j+1] = temp ;
        //bul变为false之后说明数组里顺序还没排好还需要继续比较,不能跳出去
        bul = false ; 
      }
    }
  }
  if(bul){
    return arr ;
  }
}

var arr = [3,5,4,8,2,1,6,9]
console.log( bubol(arr) );      //[1, 2, 3, 4, 5, 6, 8, 9]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

画图解析 
技术分享

素数:又称质数,只能被1和本身整除的数

方法一:

   function isPrime(num){//除了自身和1以外,不能被其他数整除。//如:要求10是不是素数,只用判断10以内的数(除去1和10本身)能否被10整除,也就是说把10以内的数挨个对10取余如果为零说明10就是素数for(var i=2;i<num;i++){
           if(num%i===0){
               return false;
           }
       }
       return true;
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

方法二:

   function isPrime(num){//开闭原则var bool = true;
       //除了自身和1以外,不能被其他数整除。for(var i=2;i<num;i++){
           if(num%i===0){
               bool = false;
           }
       }
       return bool;
   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

方法三:

   function isPrime(num){//除了自身和1以外,不能被其他数整除。//判断一个数是不是指数,只需要判断到他的平方根,超过平方根在判断,无意义。//因为一个数是由两个数相称得到的,一个变大,另外一个必然变小,那么判断到这个数的平方根就已经是极限了,不必超过平方根for(var i=2;i<=Math.sqrt(num);i++){
           if(num%i===0){
               return false;
           }
       }
       return true;
   }



求斐波那契的任意一项(又称兔子问题)

  • 斐波那契数列:前两项都是1,从第三项开始每一项都是前两项之和;如:1,1,2,3,5,8,13,21,34,55等等
    function getValue(n){//回顾求斐波那契数列的第12项var num1 = 1;
        var num2 = 1;
        //循环到第几位,就把n的值赋值成为几。for(var i=3;i<=n;i++){
            //交换变量var temp = num2;
            num2 = num1+num2;
            num1 = temp;
        }

        return num2;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 递归法求斐波那契
//1,1,2,3,5,8,13,21,55// 递归法求斐波那契function fib(n){if(n == 1|| n== 2){
      return 1;
  }else{
      return fib(n - 1) + fib(n - 2);
  }
};
console.log( fib(8) ) ;      //21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

判断某年某月某天是当年的第几天(如:2016年1月2号是2016年的第2天)

    //步骤://1.判断是否是闰年。//2.求天数。(年判断是否是闰年,月是否超过2月,天最好做)//1.把每月的天数组成一个数组,不包含闰年。//2.如果是闰年,而且超过了二月,直接在天数上+1;//2.求天数。(年判断是否是闰年,月是否超过2月,天最好做)//1.把每月的天数组成一个数组,不包含闰年。//2.如果是闰年,而且超过了二月,直接在天数上+1;

    console.log(getDays(2015,3,1));
//    console.log(getDays(2015,5,67));//参数问题:年月日是变化的。处理方法有两种,第一种就是变成成员变量,不方便。//第二种是把年月日变成参数。function getDays(year,month,day){//1.把每月的天数组成一个数组,不包含闰年。var arr = [31,28,31,30,31,30,31,31,30,31,30,31];
        //2.如果是闰年,而且超过了二月,直接在天数上+1;//把输入的月份之前的天数放入到day中。(不包含本月)//输入的月份我们把他当做索引值用。(所以我们要把月份-1,而且不能相等)for(var i=0;i<month-1;i++){
            //把月份之前的所有天数放入到day中//            day = day + arr[i];
            day += arr[i];
        }
        //判断是否是闰年且月份是否超过2月。不能等于二月。如果超过day+1;if(month>2 && isRN(year)){
           //day++;
            day+=1;
        }
        //算好的天数,返回,外部使用return day;
    }


    //1.判断是否是闰年。function isRN(year){//要有返回值,将来判断是否是闰年,是否超过2月,如果是添加1天。//(四年一闰,百年不闰,四百年在闰) 4  8 64  24  36行  100/200/300不行    400、800、1200行//        if(year%4===0 && year%100!==0 || year%400===0){//            return true;//        }else{//            return false;//        }if(year%4===0 && year%100!==0 || year%400===0){
            return true;
        }
        return false;
    }

















以上是关于JavaScript面试题之代码篇的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

前端面试题之代码输出篇

前端面试题之JavaScript篇

面试题之请写出用于校验 HTML 文本框中输入的内容全部为数字 的 javascript 代码

java面试题之mybatis篇

2017前端面试题之Html篇