codewars题目记录
1、问题描述:传入一个二维数组[[上车人数,下车人数],…],计算上车下车人数变动后车上剩下的总人数
//我的代码
var number = function(busStops){// Good Luck!var len = busStops.length;var num = 0;for(var i = 0; i < len; i++){num = num + busStops[i][0] - busStops[i][1];}return num;
}//票数最高的代码
const number = (busStops) => busStops.reduce((rem, [on, off]) => rem + on - off, 0);
注意点:
1)第一种代码是最容易想到的,最普遍的代码,但第二种灵活运用数组的迭代方法Array.reduce(Function),reduce()方法对数组的每一个元素执行函数,并返回一个值,在第二种代码中传入参数:总数(初始值/先前返回值),每次上下车的人数,总数的初始值。
2)箭头函数(匿名函数):
x => x * x
//相当于
function (x) {return x * x;
}
箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ … }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ … }和return,当参数不止一个时,用括号括起来。
如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:
// SyntaxError:
x => { foo: x }
因为和函数体的{ … }有语法冲突,所以要改为:
// ok:
x => ({ foo: x })
箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略。
2、问题描述:将一个数组中的0移到数组末尾,其他元素保持顺序
//我的代码
var moveZeros = function (arr) {var len = arr.length;for (var i = 0; i < len; i++) {if (arr[i] === 0) {arr.splice(len, 0, arr[i]);arr.splice(i, 1);i--;len--;}}return arr;
}//票数最高的代码
var moveZeros = function (arr) {return arr.filter(function(x) {return x !== 0}).concat(arr.filter(function(x) {return x === 0;}));
}
注意点:
1)第一种代码有个地方很容易出错,经常会将 len-- 这一步忘记,使代码在后面会出现无限循环的情况,导致浏览器崩溃,第二种代码巧妙地将数组中为0和不为0的部分分割,并合并数组!
2)Array.filter()能筛选出数组中符合条件的元素,Array.concat()来连接数组。
3、问题描述:根据不同人数的姓名数组,返回对应数组长度的字符串
//我的代码
function likes(names) {// TODOvar len = names.length;var piece = " likes this";var Piece = " like this";var noone,First,Second,Third,num;switch(len){case 0:noone = "no one";noone += piece;return noone;case 1:First = names[0];First += piece;return First;case 2:First = names[0];Second = names[1];First += " and " + Second + Piece;return First;case 3:First = names[0];Second = names[1];Third = names[2];First += ", " + Second + " and " + Third + Piece;return First;default:First = names[0];Second = names[1];num = len - 2;First += ", " + Second + " and " + num + " others" + Piece;return First; }
}//票数最高的代码
function likes(names) {names = names || [];switch(names.length){case 0: return 'no one likes this'; break;case 1: return names[0] + ' likes this'; break;case 2: return names[0] + ' and ' + names[1] + ' like this'; break;case 3: return names[0] + ', ' + names[1] + ' and ' + names[2] + ' like this'; break;default: return names[0] + ', ' + names[1] + ' and ' + (names.length - 2) + ' others like this';}
}//另一种代码
function likes (names) {var templates = ['no one likes this','{name} likes this','{name} and {name} like this','{name}, {name} and {name} like this','{name}, {name} and {n} others like this'];var idx = Math.min(names.length, 4);return templates[idx].replace(/{name}|{n}/g, function (val) {return val === '{name}' ? names.shift() : names.length;});
}
注意点:
1)第一种代码声明了太多的变量,使代码看起来过于繁杂,当直接将声明的变量相加时,即为第二种代码,第三种代码采用了模板字符串,匹配模板字符串中的{name}和{n},如果为{name},则将字符串数组的首个元素移除并返回,若为{n},则返回剩余元素的个数(此时前面的元素都被移除了)。
4、问题描述:给出一个数组,数值为0或1,将其连成的二进制转化为十进制
//我的代码
const binaryArrayToNumber = arr => {// your codevar len = arr.length;var num = 0;for(var i = 0; i < len; i++){num += arr[i] * Math.pow(2,len-1-i);}return num;
};//票数最高的代码
const binaryArrayToNumber = arr => parseInt(arr.join(''),2);
注意点:
1)第一种的代码思想是对每位进行2的相应次方运算并结果相加,而第二种代码将数组转换为字符串并运用方法将二进制转为十进制。
5、问题描述:根据一个模板将数值数组串成一个字符串
//我的代码
function createPhoneNumber(numbers){return "(" + numbers[0] + numbers[1] + numbers[2] + ")" + " " + numbers[3] + numbers[4] + numbers[5] + "-" + numbers[6] + numbers[7] + numbers[8] + numbers[9];
}//票数最高的代码
function createPhoneNumber(numbers){numbers = numbers.join('');return '(' + numbers.substring(0, 3) + ') ' + numbers.substring(3, 6) + '-' + numbers.substring(6);
}//另一种代码
function createPhoneNumber(numbers){var format = "(xxx) xxx-xxxx";for(var i = 0; i < numbers.length; i++){format = format.replace('x', numbers[i]);}return format;
}//第四种代码
function createPhoneNumber(numbers){return numbers.join(‘‘).replace(/(...)(...)(.*)/, ‘($1) $2-$3‘);
}
注意点:
1)第一种代码简洁明了,但当数组元素多时,就会特别麻烦低效,第二种代码将数组转化为字符串,并通过str.substring()来提取字符串中的字符,第三种代码通过定义字符串格式再进行逐个替换,第四种代码通过$1,$2,$3来替代3个表达式,分别对应字符串的前3个字符,中间3个字符和最后的所有字符进行替换。
6、问题描述:将字符串中的字母分别用对应的数字代替,不区分大小写,对字符串非字母的部分忽略
//我的代码
function alphabetPosition(text) {var t = text.split("");for (var i = 0; i < t.length; i++) {var x = t[i].charCodeAt();if ((x >= 65 && x <= 90) || (x >= 97 && x <= 122)) {t[i] = (x >= 97 ? x - 96 : x - 64).toString();} else {t.splice(i--, 1);}}text = t.join(" ");return text;
}//票数最高的代码
function alphabetPosition(text) {return text.toUpperCase().match(/[a-z]/gi).map( (c) => c.charCodeAt() - 64).join(' ');
}
注意点:
1)第一种方法为常规解法,第二种方法通过将字符串全转换为大写并将字母都转换为对应数值再串成字符串,通过数组和字符串的转换和对应方法来解题。
总结:
1)在很多情况下可以用数组的迭代方法来达到目的,使代码更加简短整洁,而不是凡事都用for循环
2)在有必要的时候声明变量,但不要过多声明变量,会使代码过于繁杂。
3)在写代码过程中要对每一个变量的值做到心里有数,往往当变量的值改变时我们却未曾注意,导致结果与预期不同。
4)熟练掌握数组和字符串的各种方法和两者之间的转换。
codewars题目记录相关推荐
- JavaScript预解析、作用域题目记录
JavaScript预解析.作用域题目记录 写出以下题目执行的结果及过程分析 function fun ( n ) {console.log( n );var n = 456;console.log( ...
- 自用PTA题目记录0024
自用PTA题目记录0024 以下题目序号并无实际意义 文章目录 自用PTA题目记录0024 9-2 A+B的文本文件版 代码 总结 9-2 A+B的文本文件版 题目作者: 翁恺 单位: 浙江大学 内存 ...
- 【面试题目】2019年中心面试题目记录
网络上能找到流传出来的中心面试题目记录 大数据是什么? 云计算的理解? 单位涉密应该怎么做? 对于一些名词的解释:拒绝服务攻击.网络冒仿.网络蠕虫.网页恶意代码.木马主机.网络篡改 什么是物联网? 你 ...
- 自用PTA题目记录0001
自用PTA题目记录0001 以下题目序号并无实际意义 文章目录 自用PTA题目记录0001 7-1 检查密码 代码 总结 7-1 检查密码 题目作者: 陈越 单位: 浙江大学 代码长度限制: 16 K ...
- 自用PTA题目记录0025
自用PTA题目记录0025 以下题目序号并无实际意义 文章目录 自用PTA题目记录0025 10-1 查询图书表中全部图书的最高售价.最低售价和平均售价 代码 总结 10-1 查询图书表中全部图书的最 ...
- 自用PTA题目记录0023
自用PTA题目记录0023 以下题目序号并无实际意义 文章目录 自用PTA题目记录0023 9-1 JAVA文件读写A+B题 代码 总结 9-1 JAVA文件读写A+B题 题目作者: zouxuxia ...
- LeetCode数据库SQL题目记录(难度:简单)
难度:简单 目录 175. 组合两个表 176. 第二高的薪水 181. 超过经理收入的员工 182. 查找重复的电子邮箱 183. 从不订购的客户 196. 删除重复的电子邮箱 197. 上升的温度 ...
- 【题目记录】——The 2021 ICPC Asia Jinan Regional Contest
文章目录 C Optimal Strategy 组合数 H Game Coin K Search For Mafuyu 欧拉序列 题目集地址 The 2021 ICPC Asia Jinan Regi ...
- CTF题目记录2(图片隐写)
网上找了一个图片隐写的练习,故记录一下 题目1 png图片–LSB隐写 习惯性要先查看属性–没收获 然后stegsolve 我当然是用data extract查看了各个通道的最后两位情况,并保存了几个 ...
最新文章
- cheat engine lua
- 10.python网络编程(socket server 实现并发 part 2)
- MVC中用Jquery、JS和Ajax 实现分页 存储过程是用mysql写的。
- 动力电池溯源追溯系统_来溯有源的区块链溯源系统、追溯系统为什么做的好?值得推荐!...
- 用友发布智多星 AI 企业大脑,其核心组成原来是这样的
- SQL SERVER 中的*=和=*
- 如何最大化使用BI工具
- [LeetCode][easy]Longest Commong Prefix
- EP100的局部地址、逻辑地址和全局地址
- ABAP EXPORTING IMPORTING
- android 闪屏 实现,Android游戏闪屏实现步骤详解
- pygame的基础知识详解(主窗口创建、图像绘制、时钟对象和事件响应等知识点),请惠存
- 如何提高论文阅读速度?
- WiFi无线干扰器(无需知道无线密码)
- 使用TamperMonkey实现慕课网自动播放下一集
- 中天视听王 未来软件园
- 计算机丢失unityplayer.dll,UnityPlayer.dll
- 以计算机网络为话题的英语作文,以互联网与我们的生活为话题的英语作文
- python turtle什么意思_python的turtle模块可以画什么
- 微博应对突发热点事件的弹性调度实践
热门文章
- 活动 支付、退款相关的订单测试
- IoT企业物联网平台,从设备端到云端业务系统全链路开发实战——实践类
- 2013年十大免费云空间排行榜-给开发者建站用的免费云主机
- 2019年中国研究生数学建模竞赛D题 汽车行驶工况构建
- 机顶盒ttl无法输入_中兴盒子连接TTL线后无法输入代码、不跑码乱码的解决方法分享...
- 五、DML(数据操纵语句)
- unsigned long long类型与long long类型
- 2020个人网站搭建指南(华为云+wordpress)
- 电子商务业务模块分析和介绍以及开发流程
- word文档找不到smartart_Word2007新工具“SmartArt”使用教程