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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章