题目列表
第一题:数字转换为字符串
题目
sumStrings(‘1’,‘2’) // => ‘3’
注意的地方在于大数字的计算会被转换为科学计数法,并且会省略一部分数字,所以把科学计数法转换为正常十进制的结果不对
这里可以看出 toString 和 toLocalString两个方法的区别
我们需要的是:712577413488402631964821329
toString() : 7.125774134884027e+26
toLocalString() : 712,577,413,488,403,000,000,000,000
代码
// 没有解决,采用取巧的办法提交,去查看答案区的方法
//代码区方案
// 一、利用数组,逐个计算
function sumStrings(a,b) {
var res="",c=0;
a=a.split("");b=b.split("");
while(a.length||b.length||c){
c=+(a.length>0?a.pop():0) + +(b.length>0?b.pop():0)+c;
res=(c%10).toString()+res;
c=Math.floor(c/10);
}
res=res.replace(/^[0]*/g,"");
return res;
}
第二题:字符串正则转换
题目
有多个相同的字符,转换为 ‘)’,单个字符转换为 ‘(’
Examples
“din” => “(((”
“recede” => “()()()”
“Success” => “)())())”
“(( @” => “))((”
代码
// 原始思路
// 注意点:
// new RegExp 可使用变量
// /[^A-z]/.test(item) && ('\\'+item) 判断并添加转义字符
function duplicateEncode(word){
// ...
let reW = word.length - word.replace(/\)/g,'').length > 1 ? word : word.replace(')','(')
word.split('').forEach(item=>{
if(item == ')') return;
var rep = new RegExp(/[^A-z]/.test(item) && ('\\'+item) || item,'gi')
reW = reW.length - word.replace(rep,'').length > 1 ? reW.replace(item,')') : reW.replace(item,'(')
})
return reW
}
// 代码区
// 一、比较某个元素初次出现的位置和最后出现的位置是否相同
function duplicateEncode(word){
return word
.toLowerCase()
.split('')
.map( function (a, i, w) {
return w.indexOf(a) == w.lastIndexOf(a) ? '(' : ')'
})
.join('');
}
// 二、查询是否有同样的元素出现在不同的位置
function duplicateEncode(word) {
var letters = word.toLowerCase().split('')
return letters.map(function(c, i) {
return letters.some(function(x, j) { return x === c && i !== j }) ? ')' : '('
}).join('')
}
第三题:查询数组最大值和最小值
题目
Example:
highAndLow(“1 2 3 4 5”); // return “5 1”
highAndLow(“1 2 -3 4 5”); // return “5 -3”
highAndLow(“1 9 3 4 -5”); // return “9 -5”
代码
// 原始思路,这个麻烦了,看代码区代码
function highAndLow(numbers){
// ...
return numbers.split(' ').reduce((a,b)=>Math.max(a,b)) + ' ' + numbers.split(' ').reduce((a,b)=>Math.min(a,b))
}
// 代码区代码
function highAndLow(numbers){
numbers = numbers.split(' ');
return `${Math.max(...numbers)} ${Math.min(...numbers)}`;
}
第四题:字符串去重并排序
题目
a = “xyaabbbccccdefww”
b = “xxxxyyyyabklmopq”
longest(a, b) -> “abcdefklmopqwxy”
代码
function longest(s1, s2) {
// your code
return (s1+s2).split('').sort().filter((item,index,arr) => item !== arr[index-1]).join('')
}
// 答案区代码
// 利用 Set 结构去重
const longest = (s1, s2) => [...new Set(s1+s2)].sort().join('')
// or
function longest(s1, s2) {
return Array.from(new Set(s1 + s2)).sort().join('');
}
第五题:计算Unicode编码
题目
代码
// 原始思路
function findMissingLetter(array)
{
return String.fromCharCode(array.filter((a,i,arr)=>(arr[i+1] || a).charCodeAt(0) - a.charCodeAt(0) == 2)[0].charCodeAt(0)+1)
}
// 代码区
// 方法一
function findMissingLetter(array) {
let first = array[0].charCodeAt(0)
for (let i = 1; i < array.length; i++) {
if (first + i !== array[i].charCodeAt(0)) {
return String.fromCharCode(first + i)
}
}
throw new Error("Invalid input")
}
//方法二
function findMissingLetter(array)
{
var i=array[0].charCodeAt();
array.map(x=> x.charCodeAt()==i?i++:i);
return String.fromCharCode(i);
}
第六题:数组去重与求和
题目
范围内3和5的倍数的累加和
solution(10) => [3,5,6,9] => 23
代码
// 原始代码
function solution(number){
let i=0,arr = [];
while(3*i<number){
3*i<number && arr.push(3*i)
5*i<number && arr.push(5*i)
i++
}
return arr.length ? [...new Set(arr)].reduce((a,b)=>a+b) : 0
}
// 答案区
// 一、map过滤
function solution(number){
return number < 3 ? 0
: [...Array(number).keys()]
.map(int => (int % 3 === 0 || int % 5 === 0) ? int : 0 )
.reduce((a, b) => a + b )
}
// 二、for 循环累加
function solution(number){
var sum = 0;
for(var i = 1;i< number; i++){
if(i % 3 == 0 || i % 5 == 0){
sum += i
}
}
return sum;
}
第七题:数组过滤指定元素
题目
[‘n’, ‘s’, ‘w’, ‘e’]这样一个数组,数组长度为10
其中 n 的数量 等于 s 的数量
w 的数量 等于 e 的数量
isValidWalk([‘n’,‘s’,‘n’,‘s’,‘n’,‘s’,‘n’,‘s’,‘n’,‘s’]) => true
isValidWalk([‘n’,‘s’,‘n’,‘s’,‘n’,‘s’,‘n’,‘s’]) => fasle
代码
// 原始思路
function isValidWalk(walk) {
const wfl = i => walk.filter(item => item==i).length;
return walk.length == 10
&& wfl('n') == wfl('s')
&& wfl('w') == wfl('e')
}
// 代码区
// 一、好理解,值遍历一次数组
function isValidWalk(walk) {
var dx = 0
var dy = 0
var dt = walk.length
for (var i = 0; i < walk.length; i++) {
switch (walk[i]) {
case 'n': dy--; break
case 's': dy++; break
case 'w': dx--; break
case 'e': dx++; break
}
}
return dt === 10 && dx === 0 && dy === 0
}
第八题:异或比较
题目
给定一个数组,找出出现奇数次的整数。
findOdd([20,1,1,2,2,3,3,5,5,4,20,4,5]) => 5
代码
// 原始思路,缺点遍历多次,耗时间
function findOdd(A) {
const afl = a => A.filter(item=>item!=a).length;
return A.filter(item=>afl(item)%2==0)[0];
}
// 答案区代码
/**
这里用到了异或操作,二进制比较
相同为假,不同为真,比较到最后只剩下一个,就是多余的奇数
这个方法太棒了
异或方法原理示例
# [32] [16] [8] [4] [2] [1]
16 0 1 0 0 0 0
6 0 0 0 1 1 0
22 0 1 0 1 1 0
*/
const findOdd = (xs) => xs.reduce((a, b) => a ^ b);
第九题:选出数组最小值
题目
求出数组最小的两个值的和,不考虑空值等情况
代码
function sumTwoSmallestNumbers(numbers) {
//Code here
return numbers.sort((a,b)=>(a-b))[0] + numbers.sort((a,b)=>(a-b))[1]
}
第十题:对象名为变量
题目
判断对象是否存在,不存在则返回’There is no mnemonic for this.’
判断属性是否存在,不存在则返回"You’re onto something, but still quite far off."
对象属性存在则返回属性值
代码
// 原始思路
function mnemonicLookup(group, word) {
// objects have been preloaded
return this[group]
? this[group][word]
? this[group][word]
: "You're onto something, but still quite far off."
: 'There is no mnemonic for this.'
}