资讯专栏INFORMATION COLUMN

三道关于字符串的JavaScript面试题解析

Sourcelink / 2743人阅读

摘要:方法二生成统计次数字符最多的是,出现了次点评稍微好一点。问题三题目如何给字符串加千分符例如方法一转换的方法转化为数组最终的结果点评将字符串转化为数组,然后对其切分重组。

分享几道js面试题,自己感觉还是挺重要的,当看到题目的时候希望大家先花几秒钟考虑一下,
然后在看答案。如果有比较好的解法,欢迎大家留言指正,谢谢大家!

第一题

题目: 写一个字符串转换成驼峰的方法?

例如:border-bottom-color -> borderBottomColor

方法一
let str = "border-bottom-color";

function change(val){
     // 用‘-’切分成一个数组
    let arr = val.split("-");  
   
   // 首字符大写
   for(let i = 1; i < arr.length; i++){
     arr[i] = arr[i].charAt(0).toUpperCase() + arr[i].substring(1);
   } 
   
   // 将字符串拼接后返回
    return arr.join("");
}

点评: 这种方法虽然可以实现,但还是太LOW了,一点都不简洁。

方法二
let str = "border-bottom-color";

function change(val){
     return str.split("-").reduce((prev,cur,index) => {
         return prev + cur.charAt(0).toUpperCase()+cur.substring(1);
    });
}

点评: 这种方法使用了数组的 reduce() 方法,稍微简洁了一点点,但还是不够好。

方法三
let str = "border-bottom-color";

function change(val){
     // 定义正则表达式
     let re = /-(w)/g;
      
     return str.replace(re,($0,$1) => {
        return $1.toUpperCase();
    });
}

点评: 第三种方法使用正则表达式,效果还是不错的。

备注:
replace()方法的第二个参数可以是一个函数:
参数一:$0 正则的整体 -b -c
参数二:$1 正则当中子项的第一个(用括号括起来的就叫做子项) b c

第二题

题目: 查找字符串中出现最多的字符和个数?

例如:abbcccffffddd -> 字符最多的是d,出现了5次

方法一
let str = "abbcccffffddd";

let obj = {};

// 生成obj对象
for(let i = 0;i < str.length; i++){
    let cur = str[i]; // 当前字符
    
    if(!obj[ cur ]){
        obj[ cur ] = [];            
    }

    obj[ cur ].push(cur);
} 

// 统计次数
let num = 0;
let char = "";
for(item in obj){
    if(num < obj[item].length){
        num = obj[item].length;
        char = obj[item][0];
    }
}
console.log(`字符最多的是${char},出现了${num}次`);

点评: 虽然能实现,但是太麻烦。

方法二
let str = "abbcccffffddd";

// 生成obj
let obj = str.split("").reduce((prev,cur) => {
    prev[cur] ? prev[cur]++ : prev[cur] = 1;
    return prev;
},{});

// {a: 1, b: 2, c: 3, d: 5}


let num = 0;
let char = "";

// 统计次数
for(item in obj){
    if(num < obj[item]){
        num = obj[item];
        char = item;
    }
}
console.log(`字符最多的是${char},出现了${num}次`);

点评: 稍微好一点。仍然是使用 reduce() 这个方法。
哈哈,万能的 reduce

方法三
let str = "abcabcabcbbccccc";
let num = 0;
let char = "";

 // 使其按照一定的次序排列
str = str.split("").sort().join("");
// "aaabbbbbcccccccc"

// 定义正则表达式
let re = /(w)1+/g;
str.replace(re,($0,$1) => {
    if(num < $0.length){
        num = $0.length;
        char = $1;        
    }
});
console.log(`字符最多的是${char},出现了${num}次`);

点评: :使用正则表达式总是那么简单。

问题三

题目: 如何给字符串加千分符?

例如:42342342342 -> 42,342,342,342

方法一
let str = "12312345678988";

// 转换的方法
function change(str){
    // 转化为数组
    var arr = str.split("");
    var result = [];

    while(arr.length > 3){
      result.push(arr.splice(-3,3).join(""));
    }
    result.push(arr.join(""));

    // 最终的结果
    return result.reverse().join(",");
}

点评: :将字符串转化为数组,然后对其切分重组。

方法二
let str = "12312345678988";

function change(str){
    // 仅仅对位置进行匹配
    let re = /(?=(?!)(d{3})+$)/g; 
   return str.replace(re,","); 
}

点评: :这个正则表达式就有点屌了。

(?=) : 前向声明
(?!) : 反前向声明

举个小栗子

    var str = "abacad";
   
   var re = /a(?=b)/g;
   str.replace(re,"*");  // 结果:"*bacad"
   // 将a后边为‘b’的a替换为‘*’号
   
   var re = /a(?!b)/g;
   str.replace(re,"*");  // 结果:"ab*c*d"
   // 将a后边不为‘b’的a替换为‘*’号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93658.html

相关文章

  • 【转载】十三道JavaScript基础,你是否都做对了?

    摘要:题目二答案会报错未定义这段代码中混合了函数声明和函数表达式的形式,而函数实际上是绑定到了上而不是。除此之外函数声明与函数表达式的语法其实是等价的。因此,在外层函数函数体内的两个函数声明,都会提升到之前执行。 这是我在Javascript微信公众号上看到的一篇文章,觉得挺有意思的,所以转载过来跟大家分享一下,同时,对这些题目也加上了一些我个人的理解,如果有不对的地方,请大家指正。 题目...

    raoyi 评论0 收藏0
  • 几道前端面试小记

    摘要:全局环境调用函数的对象实际为,所以函数内的指向构造函数通过构造函造函数生成了一个新对象,指向这个新对象。学习前端一个月,上一周面试了大概多家,收获的却是寥寥。为了效率,前端各方面的内容都有涉猎,深度却相当不足,面试时暴露各种问题。 最近面试了不少家,苦于前端经验薄弱,被各种血虐。做了不少家面试题,把各种不会的回来再做一遍,作为经验总结吧。 1.如何最优性能去重一个数组? 方法有好多,比...

    tulayang 评论0 收藏0
  • 几道前端面试小记

    摘要:全局环境调用函数的对象实际为,所以函数内的指向构造函数通过构造函造函数生成了一个新对象,指向这个新对象。学习前端一个月,上一周面试了大概多家,收获的却是寥寥。为了效率,前端各方面的内容都有涉猎,深度却相当不足,面试时暴露各种问题。 最近面试了不少家,苦于前端经验薄弱,被各种血虐。做了不少家面试题,把各种不会的回来再做一遍,作为经验总结吧。 1.如何最优性能去重一个数组? 方法有好多,比...

    yhaolpz 评论0 收藏0
  • 几道前端面试小记

    摘要:全局环境调用函数的对象实际为,所以函数内的指向构造函数通过构造函造函数生成了一个新对象,指向这个新对象。学习前端一个月,上一周面试了大概多家,收获的却是寥寥。为了效率,前端各方面的内容都有涉猎,深度却相当不足,面试时暴露各种问题。 最近面试了不少家,苦于前端经验薄弱,被各种血虐。做了不少家面试题,把各种不会的回来再做一遍,作为经验总结吧。 1.如何最优性能去重一个数组? 方法有好多,比...

    ChanceWong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<