js面试题(一)

来源:互联网 发布:上瘾网络剧第十六集 编辑:程序博客网 时间:2024/05/18 00:05

记录几个比较典型的js面试题

1 类似 border-bottom-color的字符串转成驼峰形式的字符串

方法1 思路:将字符串以‘-’为分割点 分割成数组,利用字符串的charAt(0)定位到首字母,利用字符串的toUpperCase()转成大写,字符串的substring(1)获取到字符串除了第一位剩余的字符,最后大写的首字母与剩余字符链接即可

 function test(str) {      var array=str.split("-");      for(var i=1;i<array.length;i++){          array[i]=array[i].charAt(0).toUpperCase()+array[i].substring(1)      }      return array.join("")  }  alert(test('border-bottom-color'))
方法2 正则 思路:正则匹配横线‘-’和其后的字母,然后借助replace方法将匹配到的子项转成
 function test2(str) {      var reg=/-(\w)/g     return  str.replace(reg,function (s0,s1) {//s0是正则匹配到的完整项-吧,-c,s1是正则里的子项 就是小括号括起来的那一项b,c          return s1.toUpperCase()      })  }

方法3 思路将字符串转成数组,然后遍历数组,遇到‘-’就删除,将下一个对象转成大写,最后连起来就可以了

function test(str) {    var strArr=str.split("");    for(var i=0;i<strArr.length;i++){        if(strArr[i]=='-'){            strArr.splice(i,1)            if(i<strArr.length){                strArr[i]=strArr[i].toUpperCase()            }        }    }    return strArr.join("")}var str="border-bottom-color-"    alert(test(str))


2 查找字符串中出现最多的字符及个数

方法1 思路:利用对象的key是不可重复的这一特点,首先把字符串转成对象(map) 类似{‘s’:['s','s','s'],'d':['d','d']} 然后遍历计算出value最长的一项即可

 var str="ssddffjcjdewddjkdjdjdjkdjkjkj";  function test(str) {      /*      * 思路:利用对象的key是不可重复的,首先把字符串转成对象形式{"s":["s","s"],"d":["d","d","d"]}      * */      var obj={};      var charstr="";      var charnum=0;      for(var i=0;i<str.length;i++){          if(obj[str.charAt(i)]){              obj[str.charAt(i)].push(str.charAt(i))          }else{              obj[str.charAt(i)]=[str.charAt(i)]          }      }      /*      * 然后遍历对象 查出数组最长的一项,它的key就是出现最多的字符 它的长度就是出现的次数      * */      for(y in obj){          debugger          if(obj[y].length>charnum){              charnum=obj[y].length              charstr=y          }      }      return {          "charstr":charstr,          "charnum":charnum      }  }  console.log(test("ssddffjcjdewddjkdjdjdjkdjkjkj"))

方法2 正则:

var str="ssddffjcjdewddjkdjdjdjkdjkjkj"; function test(str) {     /*将str转成数组 利用数组的sort方法将相同的字符放到一起然后在join()成字符串*/     var str=str.split('').sort().join('')     console.log(str)//cdddddddddeffjjjjjjjjjkkkkssw     var reg=/(\w)\1+/g     var num=0;     var char=""     str.replace(reg,function (s0,s1) {         alert(s0)         alert(s1)        if(s0.length>num){            num=s0.length;            char=s1;        }     })     console.log("出现最多的字母是"+char+" 出现的次数是"+num)//出现最多的字母是d 出现的次数是9 }  test("ssddffjcjdewddjkdjdjdjkdjkjkj")
3 将数字56891203256加上,分隔符转成货币形式的数字 56,891,203,256

  方法1 将数字长度模3取余,根据余数将数字分割成56和891203256,将891203256转成三位一组的数组,然后和之前的56一起join

 var str="56891203256"; function test(str) {   var index=(str.length)%3// 0 1 2     var arr=[];     if(index!=0){       var first=str.substring(0,index)         str=str.substring(index)         arr.push(first)     }     var num=0;     for(i=0;i<str.length;i++){        num++         if(num==3){            var tem=str.substring(i-2,i+1)             arr.push(tem)             num=0;         }     }     console.log(arr.join(","))//56,891,203,256 }  test(str)

方法2 正则

(?=) 前向声明 /a(?=b)/g 查找a前面是b的a
(?!) 反前向声明 /a(?!b)/g 查找a前面不是b的a
\b 代表一个位置 指的是字符串的开始、结束和空格的位置
(?!\b)匹配非开始结束位置

 var str="156891203256"; function test(str) {    var reg=/(?=(?!\b)(\d{3})+$)/g     return str.replace(reg,",") }  alert(test(str))

3 有a,b两个值 不借助第三个变量 交换a b两个的值
思路:既然不能借助第三方 就只能在a b之间做文章 a b可能是数字 可能是字符串
如果a b 是数字 :
a=a+b
b=a-b
a=a-b 即可
如果a b是字符串 则上面都方法用不了
类似数字的加法 我们可以考虑到数组
a=[a,b]
b=a[0]
a=a[1]
方法2 利用es6的解构赋值
var a="hello";var b="world"
var [a,b]=[b,a]
console.log(a)//world
console.log(b)//hello4 有一个数字n 不允许使用for循环 写一个方法生成数组[0,1,2...n] 如果n是5 则生成数组[1,2,3,4,5]方法1  思路:不允许使用for循环,生成一个数组?除了循环 我们还可以用递归,解决这个问题的办法就是从递归入手
var num=5function test(num) {    var arr=[];    var result=(function(){        debugger        if(num>=0){            arr.unshift(num)            num--            arguments.callee()//当递归调用自身方法 方法没有名字时 可以这么写        }        return arr    })()    alert(result)    return result;}alert(test(num))

或者

function test(num) {    var arr=[];    function digui(){        debugger        if(num>=0){            arr.unshift(num)            num--            digui()        }        return arr    }    digui()    return arr;}
方法2
思路:利用string的replace(reg,function(){}),正则匹配几次,就会回调几次回调函数
对于n,我们要生成的数组长度就是n+1,我们创建一个n+1长度的数组arr=[],arr.length=n+1 假设n=5 arr= [ , , , , ,]
利用数组的join方法将数组转成字符相同的

function test(n){    var arr=[]    var result=[]    arr.length=n+1;    var str=arr.join("a");    console.log(str)//aaaaa(5个a)    var reg=/a/g    str.replace(reg,function () {        result.unshift(n)        n--    })    result.unshift(0)    return result}   alert(test(n))


如果看这篇文章的小伙伴有其他的解决办法思路 欢迎指导(会持续更细)

原创粉丝点击