Q1:印出星星
給定 n(1<=n<=30),依照規律「印出」正確圖形
printStars(1)
正確輸出:
*
printStars(3)
正確輸出:
*
*
*
printStars(6)
正確輸出:
*
*
*
*
*
*
Q1 解
function printStars(n) {
if (n >= 1 && n <= 30) {
for (let i = 1; i <= n; i++) {
console.log("*");
}
} else console.log("請輸入1~30");
}
Q2:首字母大寫
給定一字串,把第一個字轉成大寫之後「回傳」,若第一個字不是英文字母則忽略。
capitalize('nick')
正確回傳值:Nick
capitalize('Nick')
正確回傳值:Nick
capitalize(',hello')
正確回傳值:,hello
Q2 解
function capitalize(str) {
let arr = str.split("");
const capital = arr[0].toUpperCase();
arr.splice(0, 1, capital);
return arr.join("");
}
Q3:反轉字串
給定一個字串,請「印出」反轉之後的樣子(不能使用內建的 reverse
函式)
reverse('yoyoyo')
正確輸出:oyoyoy
reverse('1abc2')
正確輸出:2cba1
reverse('1,2,3,2,1')
正確輸出:1,2,3,2,1
Q3 解
function reverse(str) {
let newArray = [];
arr = str.split("");
for (let i = arr.length - 1; i >= 0; i--) {
newArray.push(arr[i]);
}
console.log(newArray.join(""));
}
Q4:印出因數
先幫大家複習一下數學,給定一個數字 n,因數就是所有小於等於 n 又可以被 n 整除的數,所以最明顯的例子就是 1 跟 n,這兩個數一定是 n 的因數。現在請寫出一個函式來「印出」所有的因數
printFactor(10)
正確輸出:
1
2
5
10
printFactor(7)
正確輸出:
1
7
Q4 解
function printFactor(n) {
for (let i = 1; i <= n; i++) {
if (n % i === 0) {
console.log(i);
}
}
}
Q5:自己的函式自己寫
其實仔細思考的話,你會發現那些陣列內建的函式你其實都寫得出來,因此這一題就是要讓你自己動手實作那些函式!
我們要實作的函式有兩個:join 以及 repeat。(再次強調,這一題要你自己實作這些函式,所以你不會用到內建的join
以及repeat
)
join 會接收兩個參數:一個陣列跟一個字串,會在陣列的每個元素中間插入一個字串,最後回傳合起來的字串。
repeat 的話就是回傳重複 n 次之後的字串。
join([1, 2, 3], ''),正確回傳值:123
join(["a", "b", "c"], "!"),正確回傳值:a!b!c
join(["a", 1, "b", 2, "c", 3], ','),正確回傳值:a,1,b,2,c,3
repeat('a', 5),正確回傳值:aaaaa
repeat('yoyo', 2)正確回傳值:yoyoyoyo
Q5 解
function join(arr, concatStr) {
let newStr = arr[0];
if (arr !== []) {
for (let i = 1; i < arr.length; i++) {
newStr += concatStr + arr[i];
}
} else {
return newStr;
}
return newStr;
}
function repeat(str, times) {
let result = "";
for (let i = 1; i <= times; i++) {
result += str;
}
return result;
}
Q6:簡答題
在學程式的時候有一個能力很重要,你必須靜下心來一行一行看這個程式到底在幹嘛,並且在腦中模擬出這個程式執行的樣子,意思就是你要假裝自己就是 JS 引擎。
這是一個非常實用的技能,我來舉個例子。
for(var i=59; i<=61; i++) {
if(i === 60) {
console.log('剛好及格')
} else if (i < 60) {
console.log('不及格')
} else {
console.log('及格')
}
}
1. 執行第 1 行,設定變數 i 是 59,檢查 i 是否 <= 61,是,繼續執行,開始進入第一圈迴圈
2. 執行第 2 行,判斷 i 是否等於 60,不是,繼續往下
3. 執行第 4 行,判斷 i 是否小於 60,是
4. 執行第 5 行,log 不及格
5. 第一圈迴圈結束,跑回第一行,i++,i 變成 60,檢查是否 <= 61,是,繼續執行
6. 執行第 2 行,判斷 i 是否等於 60,是
7. 執行第 3 行,log 剛好及格
8. 第二圈迴圈結束,跑回第一行,i++,i 變成 61,檢查是否 <= 61,是,繼續執行
9. 執行第 2 行,判斷 i 是否等於 60,不是,繼續往下
10. 執行第 4 行,判斷 i 是否小於 60,不是,繼續往下
11. 執行第 6 行並進入到第 7 行,log 及格
12. 第三圈迴圈結束,跑回第一行,i++,i 變成 62,檢查是否 <= 61,否
13. 執行完畢
寫起來非常冗長,但每寫一步都會讓你對這個程式怎麼運作的變得更清晰,對程式思維非常有幫助。而且一但你習慣了這樣的方式,很快地對於一些簡單的情形你就不需要寫下來了,你可以直接用大腦模擬出程式執行的樣子。
現在,請假裝自己是電腦,像是上面示範的那樣,一步步寫下底下這個程式的執行流程,並且試著猜猜看它在做什麼:
function isValid(arr) {
for(var i=0; i<arr.length; i++) {
if (arr[i] <= 0) return 'invalid'
}
for(var i=2; i<arr.length; i++) {
if (arr[i] !== arr[i-1] + arr[i-2]) return 'invalid'
}
return 'valid'
}
isValid([3, 5, 8, 13, 22, 35])
Q6 解
執行流程
1. 執行第 1 行,宣告函式 isValid ,需傳入參數,呼叫最後一行的 isValid 函式,將陣列當作參數帶入 isValid 函式
2. 執行第 2 行,設定變數 i 是 0,檢查 i 是否小於傳入陣列的長度 6,是,進入迴圈
3. 執行第 3 行,判斷陣列中第 0 個元素是否小於等於 0,否,第一圈結束,跳回第 2 行,i++,i 變 1,檢查是否小於陣列長度 6,是,進入迴圈
4. 執行第 3 行,判斷陣列中第 1 個元素是否小於等於 0,否,第一圈結束,跳回第 2 行,i++,i 變 2,檢查是否小於陣列長度 6,是,進入迴圈
5. 執行第 3 行,判斷陣列中第 2 個元素是否小於等於 0,否,第一圈結束,跳回第 2 行,i++,i 變 3,檢查是否小於陣列長度 6,是,進入迴圈
6. 執行第 3 行,判斷陣列中第 3 個元素是否小於等於 0,否,第一圈結束,跳回第 2 行,i++,i 變 4,檢查是否小於陣列長度,是,進入迴圈
7. 執行第 3 行,判斷陣列中第 4 個元素是否小於等於 0,否,第一圈結束,跳回第 2 行,i++,i 變 5,檢查是否小於陣列長度,是,進入迴圈
8. 執行第 3 行,判斷陣列中第 5 個元素是否小於等於 0,否,第一圈結束,跳回第 2 行,i++,i 變 6,檢查是否小於陣列長度,否,結束此迴圈,繼續往下
9. 執行第 5 行,設定變數 i 是 2,檢查 i 是否小於陣列長度,是,進入迴圈
10. 執行第 6 行,判斷陣列第 2 個元素 8 是否不等於陣列第 1 個元素 5 與第 0 個元素 3 的和,否,第一圈結束,跳回第 5 行,i++,i 變 3,檢查是否小於陣列長度 6,是,進入迴圈
11. 執行第 6 行,判斷陣列第 3 個元素 13 是否不等於陣列第 2 個元素 8 與第 1 個元素 5 的和,否,第一圈結束,跳回第 5 行,i++,i 變 4,檢查是否小於陣列長度 6,是,進入迴圈
12. 執行第 6 行,判斷陣列第 4 個元素 22 是否不等於第 3 個元素 13 與第 2 個元素 8 的和,是,回傳 'invalid',此迴圈執行完畢
13. 執行完畢
這些題目基本上沒什麼好說的,非常基礎的題目,幫助你快速熟悉寫程式三寶
- 迴圈
- 函式
- 判斷式
小心注意一些地方就好,譬如迴圈的 i 需要宣告,或是「 印出 」跟「 回傳 」的差別與該使用的地方,還有經典的 == 與 === 的差別,也知道陣列跟字串的使用,大概就可以了