本节目录
第一题:字符串转换为二进制
题目
a+b 的结果保存为二进制字符串
代码
function addBinary(a,b) {
return (a+b).toString(2)
}
第二题:二维数组相加
题目
Visualization:
|1 2 3| |2 2 1| |1+2 2+2 3+1| |3 4 4|
|3 2 1| + |3 2 3| = |3+3 2+2 1+3| = |6 4 4|
|1 1 1| |1 1 3| |1+1 1+1 1+3| |2 2 4|
代码
function matrixAddition(a, b){
//TODO
return a.map((item,index)=>item.map((itemI,i)=>itemI + b[index][i]))
}
第三题:判断三边能否构成三角形
题目
三个参数能否构成三角形
代码
function isTriangle(a,b,c)
{
return Math.max(a,b,c)*2 < a+b+c;
}
// 代码区
// 思路一
function isTriangle(a,b,c)
{
return a + b > c && a + c > b && c + b > a;
}
// 思路二
function isTriangle(a,b,c)
{
[a, b, c] = [a, b, c].sort((x, y) => x-y);
return a+b > c;
}
第四题:返回字符串中第一个有重复值的元素
题目
返回字符串中第一个有重复值的元素
firstDup(‘tweet’) => ‘t’
firstDup(‘like’) => undefined
代码
function firstDup (s) {
// 时间挺长的,还是换用for循环比较,匹配成功就退出
return s.split('').filter((a,i,arr)=>i!==arr.lastIndexOf(a))[0]
}
第五题:循环加减乘除
题目
根据字母排序
提取数字进行计算
循环使用 加减乘除,对结果进行四舍五入
Examples :
“24z6 1x23 y369 89a 900b” = 89 + 900 - 123 * 369 / 246 = 1299
“24z6 1z23 y369 89z 900b” = 900 + 369 - 246 * 123 / 89 = 1414
“10a 90x 14b 78u 45a 7b 34y” = 10 + 45 - 14 * 7 / 78 + 90 - 34 = 60
代码
// 原始思路
/**
这个代码在处理随机测试的时候,没有通过,排序有乱
但是把随机测试的例子拿到本地却可以正常运行
*/
function doMath(s){
//your code here
const reg = (a,b)=>a.replace(/\d/g,'').charCodeAt(0) - b.replace(/\d/g,'').charCodeAt(0)
return Math.round(s.split(' ').sort((a,b)=>reg(a,b)) // 排序
.map(item=>+item.replace(/[A-z]/g,'')) // 提取数字
.reduce((a,b,i,arr)=>{ // 计算
switch(i%4){
case 1: return a+b;break;
case 2: return a-b;break;
case 3: return a*b;break;
case 0: return a/b;
}
}))
}
// 改成下面的写法通过
function doMath(s){
//字符串排序要注意,这里的 sort() 不能保证原始排序
const reg = (a,b)=>a.replace(/\d/g,'') == b.replace(/\d/g,'')
? s.indexOf(a) - s.indexOf(b)
: a.replace(/\d/g,'').charCodeAt(0) - b.replace(/\d/g,'').charCodeAt(0)
return Math.round(s.split(' ').sort((a,b)=>reg(a,b)) // 排序
.map(item=>+item.replace(/[A-z]/g,'')) // 提取数字
.reduce((a,b,i,arr)=>{ // 计算
switch(i%4){
case 1: return a+b;break;
case 2: return a-b;break;
case 3: return a*b;break;
case 0: return a/b;
}
}))
}
第六题:数组配对
题目
鞋子配对,0是左脚,1是右脚,后面是尺码,判断是否全部能配对
For:
shoes = [[0, 21],
[1, 23],
[1, 21],
[0, 23]]
the output should betrue;
代码
// 原始思路
function pairOfShoes(shoes) {
//coding and coding..
var i = 0;
shoes.map(item=>item[1]+''+item[0]).forEach((a)=>{
a.charAt(a.length - 1) == 0 ? i += +a : i -= +a - 1;
})
return shoes[1] ? !i : false
}
// 第二种思路,给自己点个赞,答案区暂未发现更好的解法
const pairOfShoes = shoes =>
shoes[1] ? !shoes.map(item=>item[0] ? +item[1] : -item[1]).reduce((a,b)=>a+b) : false
第七题:所有单词首字母大写
题目
Examples:
toWeirdCase( “String” );//=> returns “StRiNg”
toWeirdCase( “Weird string case” );//=> returns “WeIrD StRiNg CaSe”
代码
function toWeirdCase(string){
//TODO
let n = 0;
return string.split('').map((a,i,arr)=>{
a==' ' ? n = 0 : n++;
return n%2 ? a.toUpperCase() : a.toLowerCase()
}).join('')
}
第八题:比较字符串相同位置元素
题目
s1 = “6900690040”
s2 = “4690606946”
s3 = “9990494604”
比较s1和s2,0在下标3,6在下标4,4在下标8,也就是3个共有位置。
比较s1和s3,9在下标1,0在下标3,9在下标5,也就是3个共有位置。
比较s2和s3,9在下标2,0在下标3,也就是2个共有位置。
返回结果 8/30 = 0.26666*100
posAverage( “6900690040, 4690606946, 9990494604”) = 26.666
代码
function posAverage(s) {
// your code
const arrS = s.split(', ').map(i=>i.split(''));
let n = 0,m=0;
for(let j=0;j<arrS.length;j++){ // 遍历数组
for(let k=j+1;k<arrS.length;k++){ // 遍历后续的比较数组
for(let i=0;i<arrS[0].length;i++){ // 遍历比较的字符串
if(arrS[j][i] == arrS[k][i]){
n++
}
m++
}
}
}
return n/m*100
}
第九题:只对数字数组的奇数进行排序
题目
只对数字数组中的奇数进行排序、
sortArray([5, 3, 2, 8, 1, 4]) == [1, 3, 2, 8, 5, 4]
代码
function sortArray(array) {
// Return a sorted array.
const oddArr = array.filter(i=>i%2).sort((a,b)=>a-b)
return array.length ? array.map(i=>i%2 ? oddArr.shift() : i) : array
}
第十题:获取范围内所有质数
题目
获取 min 到 max 范围内有多少个质数
代码
// 代码未提交,3456232 11218321内运行时,报超时
function countPrimes(min, max) {
// return ??
let n = -1;
min = min < 2 ? 2 : min;
for(let i=min;i<=max;i++){
for(let j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
n++;
break
}
}
}
return max - min - n
}