js面试题(一)

记录几个比较典型的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 // \1表示重复的字符
     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)//hello

4 有一个数字n 不允许使用for循环 写一个方法生成数组[0,1,2...n] 如果n是5 则生成数组[1,2,3,4,5]
方法1
  思路:不允许使用for循环,生成一个数组?除了循环 我们还可以用递归,解决这个问题的办法就是从递归入手

var num=5 
function 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))

 



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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值