重復輸出一個給定的字符串
阿新 • • 發佈:2017-10-19
ats 速度 string 例如 arr 有用 字符串包含 有一個 字符
描述:重復輸出一個給定的字符串(str
第一個參數)n 次 (num
第二個參數),如果第二個參數num
不是正數的時候,返回空字符串。
思路:我將介紹三種方法:
- 使用 while 循環
- 使用遞歸
- 使用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);
重復輸出一個給定的字符串