在实际工作当中,我们常常需要对数据进行处理,比如简单的数组元素相加,字符串的倒序排列等等。如果使用C语言来解答此类问题,我们需要用到一些底层的算法逻辑,使用基础的for循环和if判断等来解决。但是,在JS这门语言中,它本身就给我们提供了很多处理字符串和数组等数据结构的函数方法,这给我们解决此类问题带来了很多便利,下面我就以几个简单的例子来为大家展示如何使用单行代码解答算法。
1. 获取最大值和最小值
编写函数
highAndLow()
, 获取数字组成的字符串中的最大值和最小值,用空格隔开并返回,要求实现以下结果:
highAndLow("1 2 3 4 5"); // "5 1"
highAndLow("1 2 -3 4 5"); // "5 -3"
highAndLow("1 9 3 4 -5"); // "9 -5"
一行代码解答:
let highAndLow = (numbers) => `${Math.max(...numbers.split(' '))} ${Math.min(...numbers.split(' '))}`;
算法解析:
numbers.split(' ') —— 用于将字符串拆分为数组
...numbers.split(' ') —— 【ES6语法】扩展运算符(...),用于将数组展开,展开的每一项作为参数传入Math.max()中
Math.max() 和 Math.min() —— 分别用于求解数组项的最大值和最小值
${} —— 【ES6语法】模板字符串,用于在字符串(用反引号`引用)中写入变量
2. 单词首字母大写
编写函数
toJadenCase()
, 将英语句子中每个单词首字母改为大写,要求实现以下结果:
var str = "how can mirrors be real if our eyes aren't real";
console.log(str.toJadenCase()); // "How Can Mirrors Be Real If Our Eyes Aren't Real"
一行代码解答:
String.prototype.toJadenCase = function(){ return this.replace(/(^|\s)[a-z]/g, x => x.toUpperCase()) };
算法解析:
/(^|\s)[a-z]/g —— 正则表达式,其中 ^ 表示字符串起始位置,\s 表示空格,[a-z] 表示单个小写字母,g 表示全局匹配
toUpperCase() —— 用于将字符串转换为大写
replace() —— 用于字符串的替换,更多用法可参见 → 简述test()、match()、replace()和search()的用法
3. 驼峰式命名转换
编写函数
toCamelCase()
, 实现驼峰式命名转换,要求实现以下结果:
toCamelCase("") // ""
toCamelCase("the-stealth-warrior") // "theStealthWarrior"
toCamelCase("The_Stealth_Warrior") // "TheStealthWarrior"
一行代码解答:
let toCamelCase = str => str.replace(/(\-|_)([a-z]|[A-Z])/g, w => w.toUpperCase().slice(1));
算法解析:
/(-|_)([a-z]|[A-Z])/g —— 正则表达式,其中 \- 表示字符 -(加反斜杠是用来转义,因为短横杠 - 为正则元字符),[a-z] 表示单个小写字母,[A-Z] 表示单个大写写字母,g 表示全局匹配
slice() —— 用于字符串的裁剪,具体用法详见 → JavaScript字符串“三剑客”
4. 句子中最短的单词长度
编写函数
findShort()
, 获取英文句子中最短单词的长度,要求实现以下结果:
findShort("bitcoin take over the world maybe who knows perhaps") // 3
findShort("turns out random test cases are easier than writing out basic ones") // 3
一行代码解答:
let findShort = s => Math.min(...s.split(" ").map(s => s.length));
算法解析:
map() —— 用于遍历处理数组元素,这里是将数组元素全部转换为数组元素字符串长度
5. 求平均数
编写函数
getAverage()
, 求解数组中所有项的平均数,最终将该平均数向下取整作为函数返回值,要求实现以下结果:
getAverage([2,2,2,2]) // 2
getAverage([1,2,3,4,5,]) // 3
getAverage([1,1,1,1,1,1,1,2]) // 1
一行代码解答:
let getAverage = marks => Math.floor(marks.reduce((prev,cur) => prev + cur) / marks.length);
算法解析:
reduce() —— 用于归并处理数组元素,这里是将所有数组元素相加,具体用法详见 → 浅谈JS中 reduce() 的用法
Math.floor() —— 用于数字向下取整
-- End --
更多有趣算法解答,欢迎关注微信公众号:前端微站