JavaScript 刷题 —— 三

本文介绍了JavaScript编程中的十个算法题目,包括数字转换为字符串、字符串正则转换、查询数组最大值和最小值等。通过这些题目,深入理解JavaScript的内置方法和算法应用,提升编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题:数字转换为字符串

题目

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.'
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值