FreeCodeCamp 算法題 2

找出多個數組中的最大數 (Return Largest Numbers in Arrays)

題目:www.freecodecamp.cn/challenges/…正則表達式

博客:singsing.io/blog/fcc/ba…數組

思路:app

  • 基本就是以前找出單詞最長的,並返回
  • 只是這個題,不止找出一個數組的最大值,而是找出多個數組的最大值並組成一個數組,這時候用 Array.map() 最合適
// 初次解法
function largestOfFour(arr) {
  return arr.map(item => Math.max(...item));
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

複製代碼

結合咱們以前那個找出最長單詞測試

  • Math.max.apply(null, array)
  • Array.sort((a, b) => b - a)[0]
// Math.max.apply(null, array)
function largestOfFour(arr) {
  return arr.map(item => Math.max.apply(null, item));
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

// Array.sort((a, b) => b - a)[0]
function largestOfFour(arr) {
  return arr.map(item => item.sort((a, b) => b - a)[0]);
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
複製代碼

而後咱們能夠利用 Array.reduce() 去實現一個 Array.map() 因此也能夠這樣寫:ui

// Array.reduce() 實現 Array.map() + Math.max()
function largestOfFour(arr) {
  return arr.reduce((acc, val) => acc.concat(Math.max(...val)), []);
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

// 爲何用的是 concat() 而不是 push()
// 由於 concat() 返回的是一個數組,而 push() 返回的是 Array.length
// 使用 push() 的話,咱們要手動 return acc 值
// 像這樣,否則的話會報錯,push is not a function
function largestOfFour(arr) {
  return arr.reduce((acc, val) => {
    acc.push(Math.max(...val))
    return acc
  }, []);
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
複製代碼

檢查字符串結尾 (Confirm the Ending)

題目:www.freecodecamp.cn/challenges/…spa

博客:singsing.io/blog/fcc/ba…prototype

思路:code

  • 它要比較的是 str 最後的部分和 target 的部分
  • 咱們能不能從 str 後面截取跟 target 同樣長的字符串
  • 我記得 slice() 是能夠反向截取的,例如 取數組最後一個元素:Array.slice(-1)
// 初次解法
function confirmEnding(str, target) {
  return target === str.slice(-target.length);
}

confirmEnding("Bastian", "n");
複製代碼

上面的是反向截取,若是咱們要正向截取呢,那咱們要知道從第幾位開始。str.lengthtarget.length 相減就 ok 了對象

比較 slice, substr, substringblog

  • str.slice(beginSlice[, endSlice]) 截取字符串的一部分,返回做爲一個新的字符串,不影響原字符串。
    • beginSlice 默認爲 0 ,當爲負數時,會加上字符串長度。
    • endSlice 默認爲字符串長度,當爲負數時,會加上字符串長度。
  • str.substr(start[, length]) 返回一個字符串中從指定位置開始到指定字符數的字符。
    • start 默認爲 0 ,當爲負數時,會加上字符串長度。
  • str.substring(indexStart[, indexEnd])
    • 若是 indexStart 等於 indexEnd,substring 返回一個空字符串。
    • 若是省略 indexEnd,substring 提取字符一直到字符串末尾。
    • 若是任一參數小於 0 或爲 NaN,則被看成 0。
    • 若是任一參數大於 stringName.length,則被看成 stringName.length。
    • 若是 indexStart 大於 indexEnd,則 substring 的執行效果就像兩個參數調換了同樣。
// slice
function confirmEnding(str, target) {
  return target === str.slice(str.length - target.length);
}

confirmEnding("Bastian", "n");
// substr
function confirmEnding(str, target) {
  return target === str.substr(str.length - target.length);
}

confirmEnding("Bastian", "n");
// substring
function confirmEnding(str, target) {
  return target === str.substr(str.length - target.length);
}

confirmEnding("Bastian", "n");
複製代碼

利用正則表達式,這個真沒想過!

  • RegExp 建立了一個正則表達式對象,用於將文本與一個模式匹配。
  • $ 表明從後面匹配
  • RegExp.test() 測試當前正則是否能匹配目標字符串
function confirmEnding(str, target) {
  return RegExp(`${target}$`).test(str)
}

confirmEnding("Bastian", "n");
複製代碼

重複輸出字符串 (Repeat a string repeat a string)

題目:www.freecodecamp.cn/challenges/…

博客:singsing.io/blog/fcc/ba…

思路一:

  • 我利用 Array(num) 去建立一個數組,該數組中有 num 項
  • Array.fill() 去填充字符串
  • Array.join() 去拼接
  • 判斷 num 是否小於 0,是的話直接返回空串,注意不能判斷是否爲真,由於 Number => Boolean 中只有 +0, -0false
function repeat(str, num) {
  if (num < 0) return ''
  return Array(num).fill(str).join('')
}

repeat("abc", 3);
複製代碼

其實嘛,看了博客知道另一種解法,感受是我對 Array.join() 不熟悉的緣由。 Array.join() 把數組的各項用分隔符隔開,拼接成字符串,不傳參的話,默認是用逗號隔開。

  • 若是是一個元素都爲空的數組
  • 這個數組又用某個字符串分隔開
  • 是否是就獲得一個重複屢次的字符串
function repeat(str, num) {
  if (num < 0) return ''
  return Array(num + 1).join(str) // 注意:num + 1
}

repeat("abc", 3);
複製代碼

思路二:直接用 String.repeat

str.repeat(count):構造並返回一個新字符串,該字符串爲指定數量的字符串的副本。

  • count: [0, 正無窮],爲 0 時,返回一個空串,非整數時,向下取整。
function repeat(str, num) {
  if (num < 0) return ''
  return str.repeat(num)
}

const repeat = (str, num) => num > 0 ? str.repeat(num) : ''

repeat("abc", 3);
複製代碼

截斷字符串 (Truncate a string)

題目:www.freecodecamp.cn/challenges/…

博客:singsing.io/blog/fcc/ba…

題目要求:

  • 若是字符串的長度比指定的參數num長,則把多餘的部分用...來表示。
  • 若是指定的參數num小於或等於3,則添加的三個點號不會計入字符串的長度。
  • 插入到字符串尾部的三個點號也會計入字符串的長度。

思路: 分不一樣狀況,進行字符串截取和拼接

function truncate(str, num) {
  // num 小於等於3時
  if (num < 4) {
    return str.slice(0, num) + '...';
  }
  // num 大於字符串長度時
  if (num >= str.length) return str;
  return str.slice(0, num - 3) + '...';
}

truncate("A-tisket a-tasket A green and yellow basket", 11);
複製代碼

使用三元運算符:a ? b : c

function truncate(str, num) {
  if (num < str.length) {
    return str.slice(0, num > 3 ? num - 3 : num) + '...'
  }
  return str
}

truncate("A-tisket a-tasket A green and yellow basket", 11)
複製代碼

其中 slice 也能夠換成 substr, substring

猴子吃香蕉, 分割數組 (Chunky Monkey)

題目:www.freecodecamp.cn/challenges/…

博客:singsing.io/blog/fcc/ba…

題目要求:

  • 把一個數組arr按照指定的數組大小size分割成若干個數組塊。
  • chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];

解題思路:

  • 咱們須要分割數組,那麼咱們看一下數組有哪些方法能夠分割 console.log(Array.prototype) 找到
    • slice()
    • splice()
  • 分割完後,要放進數組,那麼要用到:
    • push()
    • concat()
  • 那分割的過程呢,要用循環,由於不用一個個遍歷,因此用的是 while
// 由於 splice() 會改變原數組的長度,因此能夠直接判斷數組長度
function chunk(arr, size) {
 var a = []
 while(arr.length) {
   a.push(arr.splice(0, size))
 }
 return a
}

chunk(["a", "b", "c", "d"], 2);

// 由於 slice() 不會修改原數組長度,因此用變量 i 去計數
function chunk(arr, size) {
 var a = []
 var i = 0
 while(i < arr.length) {
   a.push(arr.slice(i, i + size))
   i += size
 }
 return a
}

chunk(["a", "b", "c", "d"], 2);

// 而後 push 和 concat 的區別就是返回值
// push 返回的是 arr.length
// concat 返回的是 一個新數組
複製代碼

截斷數組 (Slasher Flick)

題目:www.freecodecamp.cn/challenges/…

博客:singsing.io/blog/fcc/ba…

題目要求:返回一個數組被截斷 n 個元素後還剩餘的元素,截斷從索引 0 開始。

大概意思就是:給你一個數組,和一個數字 n ,而後你返回這個數組從 0 開始刪除掉 n 個元素的數組。

立馬就能夠想到:splice() , 換個思路想一想,截取剩餘部分的話,那能夠有 slice

  • 直接刪掉數組的一部分 splice
// splice 解法
function slasher(arr, howMany) {
  // 請把你的代碼寫在這裏
  arr.splice(0, howMany)
  return arr
}

function slasher(arr, howMany) {
  // 去掉多餘的 arr
  return arr.splice(0, howMany) && arr
}

slasher([1, 2, 3], 2);
複製代碼
  • 截取剩餘部分的 slice
function slasher(arr, howMany) {
  return arr.slice(howMany)
}

slasher([1, 2, 3], 2);
複製代碼
  • 固然你也能夠用 shift 循環 n 次,這樣也能夠從 0 開始刪除部分數組
function slasher(arr, howMany) {
  for (let i = 0; i < howMany; i++) {
    arr.shift()
  }
  return arr
}

slasher([1, 2, 3], 2);
複製代碼
相關文章
相關標籤/搜索