參考博客:singsing.io/blog/fcc/ba…git
題目要求:輸入 'hello' 輸出 'olleh'github
思路一:正則表達式
function reverseString(str) {
// 請把你的代碼寫在這裏
return str.split('').reverse().join('')
}
reverseString("hello"); // "olleh"
複製代碼
思路二:利用 for 循環遍歷數組
function reverseString(str) {
let result = ''
for(let i = str.length - 1; i >= 0; i--) {
result += str[i]
}
return result
}
reverseString("hello"); // "olleh"
複製代碼
思路三: 利用遞歸瀏覽器
function reverseString(str) {
if (str.length === 1) {
return str
} else {
return reverseString(str.substr(1)) + str[0]
}
}
reverseString("hello"); // "olleh"
// 注意:遞歸涉及到兩個因素,遞歸調用以及彈出過程。reverseString(str.substr(1)) 就是遞歸調用,+ str[0] 就是彈出過程
複製代碼
參考博客:singsing.io/blog/fcc/ba…app
計算一個整數的階乘 若是用字母 n 來表明一個整數,階乘表明着全部小於或等於n的整數的乘積。 階乘一般簡寫成 n! 例如: 5! = 1 * 2 * 3 * 4 * 5 = 120優化
即:function (num) => num!ui
// 利用 while 循環
function factorialize(num) {
var result = 1;
while(num > 1) {
result *= num;
num--;
}
return result;
}
factorialize(5); // 120
複製代碼
// 利用 reduce
// Array(num):新建一個數組 num 表明 length
// Array.fill(0):數組元素所有賦值爲 0
// Array.map(fn): 遍歷函數每一個元素,回調函數返回的做爲新的數組的值
// reduce(fn, initialAcc): 一個累計器
// 回調函數 fn(acc, val, index, array) acc 爲累計值, val 爲當前項的值, index 下標, array 原來的數組
// initialAcc 爲 acc 的初始值,若無則默認爲數組的第一項的值
const factorialize = num => Array(num).fill(0).map((value, index) => index + 1).reduce((acc, val) => acc *= val, 1)
factorialize(5) // 120
複製代碼
function factorialize(num) {
if (num > 1) {
return factorialize(num - 1) * num;
} else {
return 1;
}
}
factorialize(5); // 120
// 好像這種比較簡潔
function factorialize(num) {
// 初始及彈出條件
if (num === 0) {
return 1;
}
// 遞歸調用
return num * factorialize(num - 1)
}
複製代碼
首先回文字符串的意思就是字符串正着讀和反着讀是同樣的。 好比:
而後字符串忽略大小寫,忽略標點符號,空格:因此咱們能夠把忽略的標點符號和空格都替換掉,替換成空串(''),也能夠看做是刪掉標點符號和空格。
咱們用到的替換字符串:String.replace(regexp|substr, newSubStr|function)
而後正則表達式匹配是能夠用$1, $2
// 交換字符串中的兩個單詞
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
// Smith, John
console.log(newstr);
複製代碼
而後忽略大小寫,咱們統一轉爲小寫:String.toLowerCase()
這時候獲得的就是一個有效的字符串。 這時候咱們要反轉字符串,簡單的方法就是利用Array.reserve()
去反轉。
function palindrome(s) {
const str = s.replace(/[^a-zA-Z0-9]/g,'').toLowerCase() // 記得要加上g 全局匹配
const strReverse = str.split('').reverse().join('')
return str === strReverse
}
複製代碼
思路是這樣的:
String.split()
String.length
個人代碼:
function findLongestWord(str) {
return str.split(' ').reduce((acc, val) => acc = acc < val.length ? val.length : acc, 0)
}
findLongestWord("The quick brown fox jumped over the lazy dog")
複製代碼
第一步:分割字符串基本沒辦法優化,因此不一樣的解法基本在第二步,找出一個數組中的最大值。爲何說是一個數組中的最大值呢,由於字符串分割後就變成了數組。
個人解法就是普通的,冒泡排序,遍歷一次拿到最大值。
多種解法也就是在變相考若是求數組中最大的值:
進而有
// 結合 Math.max(a, b) 會返回 a, b 間最大的值
function findLongestWord(str) {
// 初版寫法
// return str.split(' ').reduce((acc, val) => acc = acc < val.length ? val.length : acc, 0)
// 能夠不用給 acc 賦值
// return str.split(' ').reduce((acc, val) => acc < val.length ? val.length : acc, 0)
// 結合 Math.max()
return str.split(' ').reduce((a, b) => Math.max(a, b.length), 0)
}
// Math.max.apply(null, array)
function findLongestWord(str) {
return Math.max.apply(null, str.split(' ').map(item => item.length))
}
// Math.max + ...擴展運算符
function findLongestWord(str) {
return Math.max(...str.split(' ').map(item => item.length))
}
findLongestWord("The quick brown fox jumped over the lazy dog")
// array.sort((a, b) => b - a)[0]
function findLongestWord(str) {
return str.split(' ').map(item => item.length).sort((a, b) => b - a)[0]
}
findLongestWord("The quick brown fox jumped over the lazy dog")
複製代碼
另外:Math.max() 使用 apply 和 ...擴展運算符的侷限:當數組過大時,可能會出錯。 這是由於函數的參數長度限制,在標準裏頭:Argument length limited to 65536,固然不一樣瀏覽器可能不同。
However, both spread (...) and apply will either fail or return the wrong result if the array has too many elements, because they try to pass the array elements as function parameters. See Using apply and built-in functions for more details. The reduce solution does not have this problem.
// 這是我最初的想法
function titleCase(str) {
return str.toLowerCase().split(' ').map(item => item.replace(item[0], item[0].toUpperCase())).join(' ');
}
titleCase("I'm a little tea pot");
複製代碼
參考了博客的內容後,發現直接用String.replace()
就能夠了。博客裏的其餘遍歷的方法,基本也是跟我相似的。
只是我用的是replace
去替換,他裏面用的是slice
分割拼接
即:String.replace(item[0], item[0].toUpperCase())
也能夠換成String[0] + String.slice(1)
正則表達式,參考資料:github.com/KRISACHAN/f…
()
表明分組,屢次匹配\s
表明匹配任何空白字符,因此適用於匹配空格^
表明匹配開頭[a-z]
表明匹配小寫字母的任意一個g
全局匹配需求:
/(\s|^)[a-z]/g
toUpperCase()
要使用函數item => item.toUpperCase()
不能直接用 '$1'.toUpperCase()
toUpperCase
會忽略掉不能轉換的東西,好比特殊字符、大寫字符和空格最終代碼:
function titleCase(str) {
return str.toLowerCase().replace(/(\s|^)[a-z]/g, item => item.toUpperCase())
}
titleCase("I'm a little tea pot");
複製代碼