JavaScript刷题——三
题⽬列表
第⼀题:数字转换为字符串
题⽬
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);
}
place(/^[0]*/g,"");
return res;
}
第⼆题:字符串正则转换
题⽬
有多个相同的字符,转换为 ‘)’,单个字符转换为 ‘(’
Examples
“din” => “(((”
“recede” => “()()()”
“Success” => “)())())”
“(( @” => “))((”
代码
/
/ 原始思路
// 注意点:
// new RegExp 可使⽤变量
// /[^A-z]/.test(item) && ('\\'+item) 判断并添加转义字符
function duplicateEncode(word){
// ...
let reW = word.length - place(/\)/g,'').length >1? word : place(')','(')
word.split('').forEach(item=>{
if(item ==')')return;
var rep =new RegExp(/[^A-z]/.test(item)&&('\\'+item)|| item,'gi')
reW = reW.length - place(rep,'').length >1? place(item,')'): place(item,'(')
})
return reW
}
// 代码区
// ⼀、⽐较某个元素初次出现的位置和最后出现的位置是否相同
function duplicateEncode(word){
return word
.toLowerCa()
.split('')
.map(function(a, i, w){
return w.indexOf(a)== w.lastIndexOf(a)?'(':')'
})
.join('');
}
// ⼆、查询是否有同样的元素出现在不同的位置
function duplicateEncode(word){
var letters = LowerCa().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
代码
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
代码
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]){
ca'n': dy--;break
ca's': dy++;break
ca'w': dx--;break
ca'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);
第九题:选出数组最⼩值
题⽬
求出数组最⼩的两个值的和,不考虑空值等情况
代码