javascript基础算法题

本文汇集了js的一些基础算法题,很多互联网公司在招聘初级前端开发工程师(应届生)时,都喜欢让应聘者做一些js算法题,这时,若你学会了这些js基础算法题的解题思想对你很有帮助,有一些甚至可以直接套用,所以,建议应届生面试前务必看一遍。

题目

题目1:翻转字符串。

解题思路:1、split()字符串转成数组;2、reverse()翻转数组;3、join()数组转化成字符串。

  1.  
    function reverseString(str){
  2.  
        var str=str.split("").reverse().join(""); //字符串转成数组.翻转数组.数组转成字符串
  3.  
        return str; //返回值
  4.  
    }
  5.  
    alert(reverseString("hello world!"));                   //输出结果:!dlrow olleh

 

题目2:阶乘。

方法一:while方法

  1.  
    function factorialWhile(num){
  2.  
        var result=1;
  3.  
        while(num){
  4.  
        result*=num;
  5.  
        num--;
  6.  
        }
  7.  
        return result;
  8.  
    }
  9.  
    alert(factorialWhile(5));            //输出结果:120

方法二:for方法

  1.  
    function factorialFor(num){
  2.  
        if(num<1){
  3.  
            return 1;
  4.  
        }else{
  5.  
            for(var i=num-1; i>=1; i--){
  6.  
                num*=i;
  7.  
            }
  8.  
        }
  9.  
        return num;
  10.  
    }
  11.  
    alert("for方法二:"+factorialFor(5));        //输出结果:120

方法三:递归方法

  1.  
    function factorial(num){
  2.  
        if(num<1){
  3.  
           return 1;
  4.  
        }
  5.  
        else{
  6.  
            return num*factorial(num-1);
  7.  
        }
  8.  
    }
  9.  
    alert("递归方法三:"+factorial(5));        //输出结果:120

 

题目3:如果给定的字符串是回文,返回true,反之,返回false。

回文:如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文)。

解题思路:去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文。

  1.  
    function palindrome(str){
  2.  
        var str1 = str.replace(/[^0-9a-zA-Z]/g,"").toLowerCase(); //去掉标点符号,转化成小写,比较参数一
  3.  
        //alert(str1); //输出:abc1d42efg000h000gfe24d1cba
  4.  
     
  5.  
        var str2 = str1.split("").reverse().join(""); //翻转字符串,比较参数二
  6.  
        //alert(str2); //输出:abc1d42efg000h000gfe24d1cba
  7.  
     
  8.  
        if (str1 === str2) {
  9.  
            return true;
  10.  
        } else{
  11.  
            return false;
  12.  
        }
  13.  
    }
  14.  
    alert(palindrome("aBc,./1d42--==EFG0 00 h0-';'00gfE';./. 24d 1cBA"));     //输出结果:true

 

题目4:找到提供的句子中最长的单词,并计算它的长度。

解题思路:1、转化成数组;2、根据元素长度排序;3、输出最长元素并返回长度。

  1.  
    function findLongestString(str){
  2.  
        var arr = str.split(" ");     //转化成数组,注意split()括号里为一个空格
  3.  
        //alert(arr);        //输出:I,love,China
  4.  
        var aSort = arr.sort(function (a,b){     //排序
  5.  
            return b.length-a.length;
  6.  
        });
  7.  
        //alert(aSort); //输出: China,love,I
  8.  
        document.write("最长单词:"+aSort[0]+"; ");   //第一个元素为最长
  9.  
        document.write("单词长度:"+aSort[0].length);
  10.  
    }
  11.  
    findLongestString("I love China");        //输出结果: 最长单词:China; 单词长度:5

 

题目5:确保字符串的每个单词首字母都大写,其余部分小写。

解题思路:1、字符串转化成小写;2、分割成字符串数组;3、新组合字符串元素=首字母转大写+其余小写。

  1.  
    function titleCase(str){
  2.  
        var aStr = str.toLowerCase().split(" "); //转小写,分割成字符串数组
  3.  
        for(var i=0; i<aStr.length; i++){
  4.  
            aStr[i] = aStr[i][0].toUpperCase()+aStr[i].slice(1); //重新组合字符串元素
  5.  
        }
  6.  
        var oString = aStr.join(" "); //转成字符串
  7.  
        return oString;
  8.  
    }
  9.  
    document.write(titleCase("I'm a title Case."));    //输出结果:I'm A Title Case.

 

题目6:一个大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组。

解题思路 :找出每个小数组中的最大值,把最大值存入一个新数组里输出。

方法一:使用Math.max.apply()方法提取最大值

  1.  
    function largestArray(arr){
  2.  
    var result = []; //用于存放四个小数组中最大的数
  3.  
    for (var i=0; i<arr.length; i++) {
  4.  
            result.push(Math.max.apply(null, arr[i])); //找出四个小数组中的最大值,然后插入新数组
  5.  
    }
  6.  
    return result;
  7.  
    }
  8.  
    document.write(largestArray([[165,2,9], [48,6,9,82],[6,5],[29658,91,2]])+"</br>");//输出结果:165,82,6,29658

 

方法二:排序法提取最大值

  1.  
    function largestArr(arr){
  2.  
        var result = [];
  3.  
        for (var i=0; i<arr.length; i++) {
  4.  
            arr[i].sort(function(a, b) { //对四个小数组进行排序,从大到小
  5.  
                return b-a;
  6.  
            });
  7.  
        result.push(arr[i][0]); //把四个小数组中第一个(最大)添加到result
  8.  
        }
  9.  
        return result;
  10.  
    }
  11.  
    document.write(largestArr([[165,2,9], [48,6,9,82],[6,5],[29658,91,2]])+"</br>");//输出结果:165,82,6,29658    

 

题目7:检查一个字符串(str)是否以指定的字符串(target)结尾。如果是,返回true;如果不是,返回false。

解题思路:截取字符串结尾部分(长度与target相同)与target做比较。

  1.  
    function confirmEnding(str, target){
  2.  
        var len = target.length;
  3.  
        var strEnding = str.slice(-len); //剪切字符串最后几个字符
  4.  
        if (strEnding == target) {
  5.  
            return true;
  6.  
        } else{
  7.  
            return false;
  8.  
        }
  9.  
    }
  10.  
    document.write(confirmEnding("strawberry", "rry"));    //输出结果:true

 

题目8:重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串。

  1.  
    function repeat(str, num){
  2.  
    var result=str; //将初始值赋值给result
  3.  
    if (num<=0) {
  4.  
    return "";
  5.  
    } else{
  6.  
    for (var i=0; i<num-1; i++) { //索引从0开始,循环num-1次;(出现的次数包括它本身,所以只需要循环num-1次)
  7.  
    result+=str;
  8.  
    }
  9.  
    return result;
  10.  
    }
  11.  
    }
  12.  
    document.write(repeat("love", 3));        //输出结果:lovelovelove

 

题目9:截断一个字符串,如果字符串的长度比指定的参数num长,则把多余的部分用...来表示。

解题思路:截取相应长度的字符串,然后与...拼接起来。

 

  • 规定的长度不包括...在内
  1.  
    function truncate(str, num){
  2.  
    var aStr = str.slice(0, num);
  3.  
    if (str.length > num) {
  4.  
    return aStr.concat("...");
  5.  
    }
  6.  
    else{
  7.  
    return str;
  8.  
    }
  9.  
    }
  10.  
    document.write(truncate("javascript", 8)+"</br>");    //输出结果:javascri...
  • 规定的长度包括...在内
  1.  
    function truncate(str, num) {
  2.  
        var str1=str.slice(0,num-3);
  3.  
        var str2=str.slice(0,num);
  4.  
        if(str.length > num){
  5.  
            if(num<=3){
  6.  
                return str2+'...';
  7.  
            }else{
  8.  
                return str1+'...';
  9.  
            }
  10.  
        }else{
  11.  
            return str;
  12.  
        }
  13.  
    }
  14.  
    document.write(truncate("javascript", 8));    //输出结果:javas...

 

题目10:把一个数组arr按照指定的数组大小size分割成若干个数组块。

解题思路:定义一个空数组,使用slice()每次截取原数组的size个元素插入空数组形成一个新数组。

  1.  
    function chunk(arr, size){
  2.  
        var Array = [];
  3.  
        if (arr.length > size) {
  4.  
            for (var i=0; i<arr.length; i+=size) { //每次循环size个元素
  5.  
                Array.push("["+arr.slice(i,i+size)+"]"); //每次截取size元素加入Array(为了便于观察,添加了[])
  6.  
            }
  7.  
            return Array;
  8.  
            } else{
  9.  
                return "["+arr+"]";
  10.  
    }
  11.  
        }document.write(chunk([1,2,3,4,48,666],2));     //输出结果:[1,2],[3,4],[48,666]

 

题目11:返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始。

  1.  
    function slasher(arr, n){
  2.  
        var Array = [];
  3.  
        if (n<=0) {
  4.  
            return arr;
  5.  
        } else{
  6.  
        Array.push(arr.slice(n));
  7.  
            return Array;
  8.  
        }
  9.  
    }
  10.  
    document.write(slasher([1,516,15,85,3,841], 3));       //输出结果:85,3,841

 

题目12:如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true。

解释:["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。

  1.  
    function mutation(arr){
  2.  
        var str1 = arr[0].toLowerCase();
  3.  
        var str2 = arr[1].toLowerCase();
  4.  
        for (var i=0; i<str2.length; i++) {
  5.  
            if (str1.indexOf(str2[i]) <= -1) { //str2中有元素在str1中找不到
  6.  
                return false;
  7.  
            }
  8.  
        }
  9.  
        return true;
  10.  
    }
  11.  
    document.write(mutation(["Hello", "hey"]));    //输出结果:true

indexOf()方法解释:可返回某个指定的字符串值在字符串中首次出现的位置。

 

语法:stringObject.indexOf(searchvalue,fromindex)

关键字:searchvalue,必选,规定需检索的字符串值

     fromindex,可选,从字符串的那个index开始检索

返回值:返回指定值在字符串首次出现的位置,若返回-1,则字符串中不包含改值。

 

题目13:删除数组中的所有假值。在JavaScript中,假值有false、null、0、""、undefined 和 NaN。

  1.  
    function bouncer(arr){
  2.  
        return arr.filter(test); //filter方法过滤得到符合条件的值
  3.  
    }
  4.  
    // 条件函数
  5.  
    function test(ele){
  6.  
        var cont = ele !== false || ele !== null || ele !== 0 || ele !== "" || ele !== undefined || ele !==NaN;
  7.  
        if (cont) { //如果cont成立
  8.  
            return ele;
  9.  
        }
  10.  
    }
  11.  
    document.write(bouncer([561, "hello", true, false, ""]));    //输出结果:561,hello,true

Array.filter() :检查数组得到符合指定条件(fn)的所有元素。

语法:array.filter(function(currentValue,index,arr), thisValue)

关键字:currentValue,必选,当前元素的值; index,可选,当前元素的索引; arr,可选,当前元素所属的数组。thisvalue,可选,对象作为该执行回调时使用,传递给函数,用作 "this" 的值。如果省略了 thisValue ,"this" 的值为 "undefined"

posted @ 2018-07-18 21:34  caseywei  阅读(1088)  评论(0编辑  收藏  举报