天天看點

FreeCodeCamp中文社群刷題答案及筆記(之篇三回文、數組、字元串的有關計算)

FreeCodeCamp中文社群刷題答案及筆記

      • 一、Reverse a String
      • 二、Check for Palindromes(檢查是否為回文)
      • 三、Find the Longest Word in a String(找出句子中長度最大的單詞)
      • 四、Title Case a Sentence(把句子每個單詞首字母大寫)
      • 五、Return Largest Numbers in Arrays(找出二維數組包含的每個子數組的最大數并重組為一個新數組)
      • 六、Confirm the Ending(檢查字元串是否以某個指定的字元串結尾)
      • 七、Repeat a string repeat a string(重複輸出字元串)

一、Reverse a String

翻轉字元串

先把字元串轉化成數組,再借助數組的reverse方法翻轉數組順序,最後把數組轉化成字元串。

你的結果必須得是一個字元串

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

這是一些對你有幫助的資源:

Global String Object

String.split

Array.reverse

Array.join

function reverseString(str) {
  // 請把你的代碼寫在這裡
  var strToArray = str.split('');
  //return strToArray; //["h", "e", "l", "l", "o"]
  //var strToArray = str.split(' '); //["hello"],一個個單詞
  var reverseArray = strToArray.reverse();
  //return reverseArray;  //["o", "l", "l", "e", "h"]
  var arrayToStr = reverseArray.join('');
  return arrayToStr;  
}

 // reverseString("hello"); //[olleh]
    reverseString("Hello, how are you?");
  //若是使用split(' ')和join(' '),則傳回結果為"you? are how Hello,"
           

二、Check for Palindromes(檢查是否為回文)

檢查回文字元串

如果給定的字元串是回文,傳回true,反之,傳回false。

如果一個字元串忽略标點符号、大小寫和空格,正着讀和反着讀一模一樣,那麼這個字元串就是palindrome(回文)。

注意你需要去掉字元串多餘的标點符号和空格,然後把字元串轉化成小寫來驗證此字元串是否為回文。

函數參數的值可以為”racecar”,”RaceCar”和”race CAR”。

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

function palindrome(str) {
  // 請把你的代碼寫在這裡
  var strToLowerCase = str.toLowerCase();  //把字元串轉換為小寫
  //return newStr;
  var strToArray = strToLowerCase.split('');  //把字元串轉換為數組
  //return strToArray;

  //過濾字元串中的标點符号和空格
  var newArray = strToArray.filter(function(val) {
    return (val !== " " && val !== "," && val !== "." && val !== "?" && val !== ":" && val !== ";" && val !== "`" && val !== "'" && val !== "_" &&  val !== "/" && val !== "-" && val !== "\\" && val !== "" && val !== "\(" && val !== "\)" && val !== "!");
  });
  //return newArray;

  //把過濾後的數組轉換回字元串
  var toString = newArray.join('');
  //return toString;

  //判斷是否為回文 
  for(var i=, j=toString.length-; i<j; i++, j--) {
    if(toString[i] !== toString[j]) {
        return false;
      }
  }
  return true;
}

palindrome("eyerar");  //false
           

三、Find the Longest Word in a String(找出句子中長度最大的單詞)

找出最長單詞

在句子中找出最長的單詞,并傳回它的長度。

函數的傳回值應該是一個數字。

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

//找出一個句子中最長的單詞,并傳回其長度

function findLongestWord(str) {
  //把句子分割為單詞數組
  var strToArray = str.split(' ');
  //return strToArray;

  //找出數組中長度最大的單詞
  var everyLength = [];
  for(var i = ; i < strToArray.length; i++) {
    everyLength.push(strToArray[i].length);
  }
  //return everyLength; //[3, 5, 5, 3, 6, 4, 3, 4, 3]

  //把數組中元素排序
  var sortEveryLength = everyLength.sort(function(a, b) {
    return a - b;
  });
  //return sortEveryLength; //[3, 3, 3, 3, 4, 4, 5, 5, 6]

  //傳回排序後的數組的最後一項(即長度最大項)
  return sortEveryLength[sortEveryLength.length-];  //6
}

findLongestWord("The quick brown fox jumped over the lazy dog");
           

四、Title Case a Sentence(把句子每個單詞首字母大寫)

要點:slice()方法

slice()方法介紹

slice() 方法可從已有的數組中傳回標明的元素。

參數 說明
start 可選。規定從何處開始選取。如果是負數,那麼它規定從數組尾部開始算起的位置。也就是說,-1 指最後一個元素,-2 指倒數第二個元素,以此類推。
end 可選。規定從何處結束選取。該參數是數組片斷結束處的數組下标。如果沒有指定該參數,那麼切分的數組包含從 start 到數組結束的所有元素。如果這個參數是負數,那麼它規定的是從數組尾部開始算起的元素。

slice()方法傳回一個新的數組,包含從start到end (不包括該元素)的 元素。

String.slice(start,end)

var s = "abcdefg";
s.slice(,)    // Returns "abcd"
s.slice(,)    // Returns "cd"
s.slice()      // Returns "efg"
s.slice(,-)   // Returns "def"
s.slice(,-)   // Returns "de"
s.slice(-,-)  // Should return "ef"
           

Array.slice(start,end)

傳回從start開始到end的子數組,如果end這個參數沒有被設定,則傳回從start開始到最後的數組元素。

var a = [,,,,];
a.slice(,);    // Returns [1,2,3]
a.slice();      // Returns [4,5]
a.slice(,-);   // Returns [2,3,4]
a.slice(-,-);  // Returns [3]
           

回歸本題題目

句中單詞首字母大寫

確定字元串的每個單詞首字母都大寫,其餘部分小寫。

像’the’和’of’這樣的連接配接符同理。

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

//把句子的每個單詞首字元大寫
function titleCase(str) {
  //把句子分割為單詞數組
  var toWordArray = str.split(' ');
  //return toWordArray;

  //周遊數組,把每個單詞首字母變為大寫
  var newArray = [];
  for(var i=; i<toWordArray.length; i++) {
     newArray[i] = toWordArray[i].slice(,).toUpperCase() + toWordArray[i].slice().toLowerCase();
  }
  //return newArray; //["T'm", "A", "Little", "Tea", "Pot"]

  //把新數組轉換為字元串
  var newString = newArray.join(' ');
  return newString;
}

titleCase("I'm a little tea pot");
/*titleCase("sHoRt AnD sToUt");  //Short And Stout */
           

五、Return Largest Numbers in Arrays(找出二維數組包含的每個子數組的最大數并重組為一個新數組)

找出多個數組中的最大數

右邊大數組中包含了4個小數組,分别找到每個小數組中的最大值,然後把它們串聯起來,形成一個新數組。

提示:你可以用for循環來疊代數組,并通過arr[i]的方式來通路數組的每個元素。

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

//找出每個小數組中的最大數并重組成一個新數組

function largestOfFour(arr) {
  var maxArr = [];         //接收找出的每個數組的最大數
  for(var i=; i<arr.length; i++) {
    var max = arr[i][];
    for(var j = ; j < arr[i].length; j++) {

      if(max < arr[i][j]) {
        max = arr[i][j];
      }
    }
    maxArr[i] = max;
    }
    return maxArr;
  }

largestOfFour([[, , , ], [, , , ], [, , , ], [, , , ]]); //[5, 27, 39, 1001]
           

注:此外的傳回數組中的最大最小值的方法還有(使用apply将數組傳入max方法中直接傳回)

var a = [, , , , , ];
var max = Math.max.apply(null, a);  //6
var min = Math.min.apply(null, a);  //1
           

是以,本題的解答還可以如下:

//找出每個小數組中的最大數并重組成一個新數組

function largestOfFour(arr) {
  var maxArr = [];         //接收找出的每個數組的最大數
  for(var i=; i<arr.length; i++) {
       maxArr[i] = Math.max.apply(null, arr[i]);  
  }
  return maxArr;
}

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

六、Confirm the Ending(檢查字元串是否以某個指定的字元串結尾)

檢查字元串結尾

判斷一個字元串(str)是否以指定的字元串(target)結尾。

如果是,傳回true;如果不是,傳回false。

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

這是一些對你有幫助的資源:

substr()方法介紹

substr() 方法傳回一個字元串中從指定位置開始到指定字元數的字元。

文法:

str.substr(start, length)

參數 說明
start 開始提取字元的位置。如果為負值,則被看作 strLength + start,其中 strLength 為字元串的長度(例如,如果 start 為 -3,則被看作 strLength + (-3))。
length 可選。提取的字元數(字元串長度)。如果忽略 length,則 substr 提取字元,直到字元串末尾。

start

是一個字元的索引。首字元的索引為 0,最後一個字元的索引為 字元串的長度減去1。

substr

從start 位置開始提取字元,提取

length

個字元(或直到字元串的末尾)。

如果

start

為正值,且大于或等于字元串的長度,則

substr

傳回一個空字元串。

如果

start

為負值,則

substr

把它作為從字元串末尾開始的一個字元索引。如果

start

為負值且

abs(start)

大于字元串的長度,則 substr 使用 0 作為開始提取的索引。注意負的 start 參數不被 Microsoft JScript 所支援。

如果

length

為 0 或負值,則

substr

傳回一個空字元串。如果忽略

length

,則

substr

提取字元,直到字元串末尾。

示例

var str = "abcdefghij";

console.log("(1,2): "    + str.substr(,));   // (1,2): bc
console.log("(-3,2): "   + str.substr(-,));  // (-3,2): hi
console.log("(-3): "     + str.substr(-));    // (-3): hij
console.log("(1): "      + str.substr());     // (1): bcdefghij
console.log("(-20, 2): " + str.substr(-,)); // (-20, 2): ab
console.log("(20, 2): "  + str.substr(,));  // (20, 2):
           

好了,知識準備好了,可以開始做題羅!

//判斷一個字元串(str)是否以指定的字元串結尾
/*
  本人思路為:計算出函數中的指定字元串target的長度length,
  然後在字元串str中從字元串結尾處開始查找長度為length的字元串,
  比較該字元串是否與target相等,相等傳回TRUE,否則傳回FALSE
*/
function confirmEnding(str, target) {
  var targetLength = target.length; //計算target字元串的長度
  //return targetLength;  //3
  var findSubstr = str.substr(str.length-targetLength,  targetLength);

  //return findSubstr; //ian

  //比較查找出的字元串是否等于給定的字元串target
  for(var i=; i<targetLength; i++) {
    if(target[i] !== findSubstr[i]) {
      return false;
    }
  }
  return true;
}

confirmEnding("Bastian", "ian");
           

七、Repeat a string repeat a string(重複輸出字元串)

重複輸出字元串

(重要的事情說3遍)

重複一個指定的字元串 num次,如果num是一個負數則傳回一個空字元串。

當你完成不了挑戰的時候,記得開大招’Read-Search-Ask’。

//重複一個指定的字元串 num次,如果num是一個負數則傳回一個空字元串。
function repeat(str, num) {
  if(num < ) {
    return "";
  }
  var newString = "";
  for(var i=; i<num; i++) {
    newString = newString.concat(str);
  }
  return newString;
}

repeat("abc", ); //abcabcabc