基本應用題


Posted by 小小碼農 on 2021-04-24

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 需要宣告,或是「 印出 」跟「 回傳 」的差別與該使用的地方,還有經典的 == 與 === 的差別,也知道陣列跟字串的使用,大概就可以了


#javascript







Related Posts

[5] while & for 重複迴圈

[5] while & for 重複迴圈

871. Minimum Number of Refueling Stops

871. Minimum Number of Refueling Stops

7. 物件的淺複製 深複製

7. 物件的淺複製 深複製


Comments