1. 程式人生 > >重復輸出一個給定的字符串

重復輸出一個給定的字符串

ats 速度 string 例如 arr 有用 字符串包含 有一個 字符

  描述:重復輸出一個給定的字符串(str第一個參數)n 次 (num第二個參數),如果第二個參數num不是正數的時候,返回空字符串。

  思路:我將介紹三種方法:

  1. 使用 while 循環
  2. 使用遞歸
  3. 使用ES6 `repeat()`

方法1:通過 `while` 循環重復輸出一個字符串

function repeatStringNumTimes(string, times) {
  // 第1步. 常見一個空字符,用來寄存重復的字符串
  var repeatedString = "";
 
  // 第2步. 設置 while 循環的條件為(times > 0) 作為檢查
  while (times > 0
) { // 只要 times 大於 0, 語句就會執行 // 執行語句 statement repeatedString += string; // 等價於 repeatedString = repeatedString + string; times--; // 遞減,等價於 times = times - 1; } /* while循環邏輯 條件 T/F repeatedString += string 結果 次數 1th (3 > 0) true "" + "abc" "abc" 2 2th (2 > 0) true "abc" + "abc" "abcabc" 1 3th (1 > 0) true "abcabc" + "abc" "abcabcabc" 0 4th (0 > 0) false }
*/ // 第3步. 返回重復字符串 return repeatedString; // "abcabcabc" } repeatStringNumTimes("abc", 3);

  不過這裏還可以有幾個變種:對於老前端來說,首先一個可能會將字符串拼接,修改為 數組join()拼接字符串,例如:

    function repeatStringNumTimes(string, times) {
      var repeatedArr = []; 
      while (times > 0) {
        repeatedArr.push(string);
        times
--; } return repeatedArr.join(""); } repeatStringNumTimes("abc", 3)

  很多老前端都有用數組join()拼接字符串的“情懷”,因為很早以前普遍認為數組join()拼接字符串比字符串+拼接速度要快得多。不過現在未必,例如,V8 下+拼接字符串,要比數組join()拼接字符串快。我用這兩個方法測試了3萬次重復輸出,只相差了幾毫秒。

  另一個變種可以用 for 循環:

    function repeatStringNumTimes(string, times) {
      var repeatedString = "";
      for(var i = 0; i < times ;i++) {
        repeatedString += string;
      }
      return repeatedString;
    }
    repeatStringNumTimes("abc", 3)

方法2:通過條件判斷和遞歸重復輸出一個字符串

  遞歸是一種通過重復地調用函數本身,直到它達到達結果為止的叠代操作的技術。為了使其正常工作,必須包括遞歸的一些關鍵特征。

  第一種是基本情況:一個語句,通常在一個條件語句(如if)中,停止遞歸。

  第二種是遞歸情況:調用遞歸函數本身的語句。

  這裏是解決方案:

function repeatStringNumTimes(string, times) {
  // 步驟1.檢查 times 是否為負數,如果為 true 則返回一個空字符串 
  if (times < 0) {
    return "";
  }
  
  // 步驟2.檢查times是否等於1,如果是,返回字符串本身。
  if (times === 1) {
    return string;
  }
  
  // 步驟3. 使用遞歸
  else {
    return string + repeatStringNumTimes(string, times - 1); // return "abcabcabc";
  }
  /* 
    遞歸方法的第一部分你需要記住,你不會只調用一次,您將有好幾個嵌套調用
                 times       string + repeatStringNumTimes(string, times - 1)
      1st call   3           "abc" + ("abc", 3 - 1)
      2nd call   2           "abc" + ("abc", 2 - 1)
      3rd call   1           "abc" => if (times === 1) return string;
      4th call   0           ""   => if (times <= 0) return "";
    遞歸方法的第二部分
      4th call will return      ""
      3rd call will return     "abc"
      2nd call will return     "abc"
      1st call will return     "abc"
    最後調用是串聯所有字符串
    return "abc" + "abc" + "abc"; // return "abcabcabc";
  */
}
repeatStringNumTimes("abc", 3);

方法3:使用ES6 `repeat()` 方法重復輸出一個字符串

  這個解決方案比較新潮,您將使用 String.prototype.repeat() 方法:

  repeat() 方法構造並返回一個新字符串,該字符串包含被連接在一起的指定數量的字符串的副本。 這個方法有一個參數 count 表示重復次數,介於0和正無窮大之間的整數 : [0, +∞) 。表示在新構造的字符串中重復了多少遍原字符串。重復次數不能為負數。重復次數必須小於 infinity,且長度不會大於最長的字符串。

  這裏是解決方案:

function repeatStringNumTimes(string, times) {
  //步驟1.如果 times 為正數,返回重復的字符串
  if (times > 0) { // (3 > 0) => true
    return string.repeat(times); // return "abc".repeat(3); => return "abcabcabc";
  }
  
  //Step 2. Else 如果times是負數,如果為true則返回一個空字符串
  else {
    return "";
  }
}
 
repeatStringNumTimes("abc", 3);

  您可以使用三元表達式作為 if/else 語句的快捷方式,如下所示,誰都會欣賞這樣的簡潔代碼:

function repeatStringNumTimes(string, times) {
   return times > 0 ? string.repeat(times) : "";
}
repeatStringNumTimes("abc", 3);

重復輸出一個給定的字符串