JavaScript 刷题 —— 四

第一题:字符串转换为二进制

题目

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 be true;

代码

// 原始思路
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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章