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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值