Skip to content

Latest commit

 

History

History
404 lines (303 loc) · 7.35 KB

week2_JavaScript 題目練習.md

File metadata and controls

404 lines (303 loc) · 7.35 KB
tags: JavaScript

[week 2] JavaScript - 綜合題目練習 Lv1

練習一:印出一到九

請你分別用 for loop 以及 while 迴圈,印出 1~9。

預期輸出:

1
2
3
4
5
6
7
8
9

解法:

// for loop
for (var i = 1; i<=9; i++) {
    console.log(i)
}

// while 迴圈
var i =1

while (i<=9) {
    console.log(i)
    i++
}

// do while 迴圈
var i = 1

do {
    console.log(i)
    i++
} while (i<=9)

練習二:寫一個能夠印出 1~n 的函式

請寫一個函式叫做 print,接收一個是數字的參數 n,並且印出 1~n。

print(1) 預期輸出:
1

print(3) 預期輸出:
1
2
3

print(9) 預期輸出:
1
2
3
4
5
6
7
8
9

解法:

function print(n) {
    for(var i=1; i<=n; i++){
    console.log(i)
    }
}

print(n)

練習三:寫一個能夠印出 n 個 * 的函式

寫一個函式 star,接收一個參數 n,並印出 n 個 * (禁止使用內建函式 repeat)

star(1) 預期輸出:
*
star(5) 預期輸出:
*****
star(10) 預期輸出:
**********

解法:

function star(n) {
    var answer = ''
    for (var i = 1; i <= n; i++) {
        answer += '*'
    }
    console.log(answer)
}

star(5)            // 印出 *****

由此題可實作出 repeat() 函式:

function star(str, n) {
    var answer = ''
    for (var i = 1; i <= n; i++) {
        answer += str
    }
    console.log(answer)
}

star('*', 7)            // 印出 *******

練習四:寫一個能回傳 n 個 * 的函式

請寫出一個叫做 star 的 function 並且接受一個參數 n,能回傳 n 個 *。

star(1) 會回傳 *
star(5) 會回傳 *****

所以 console.log(star(5)) 的預期輸出是:
*****

解法:

var answer = ""
function star(n) {
    for (var i = 1; i <= n; i++) {
        answer += "*"
    }
    return answer
}

console.log(star(5))        // 印出 *****

練習五:判斷大小寫

請寫一個叫做 isUpperCase 的 functuon,並且接收一個字串,回傳這個字串的第一個字母是否為大寫。

isUpperCase("abcd") 正確回傳值:false

isUpperCase("Abcd") 正確回傳值:true

isUpperCase("ABCD") 正確回傳值:true

isUpperCase("aBCD") 正確回傳值:false

解法:

function isUpperCase(str) {
    var char = str[0]
    if (char >= "A" && char <= "Z"){
        return true
    } else {
        return false
    }
}

console.log(isUpperCase("abcd"))    // 印出 false
console.log(isUpperCase("Abcd"))    // 印出 true

// 又可簡化如下:

function isUpperCase(str) {
    var char = str[0]
    return char >= "A" && char <= "Z"
}
// 透過邏輯運算,可直接回傳 true or false,就不需重複寫出判斷式

練習六:回傳第一個大寫字母以及它的 index

請寫一個 function position,接收一個字串並回傳這個字串裡面的第一個大寫字母跟它的 index,若沒有則回傳 -1。

position("abcd") 正確回傳值:-1

position("AbcD") 正確回傳值:A 0

position("abCD") 正確回傳值:C 2

解法:

function position(str) {
    for (var i=0; i<= str.length; i++) {
        if (str[i] >= "A" && str[i]<= "Z") {
            return str[i] + ' ' + i        // 字母 + 空格 + index
        }   
    } 
    return -1                    // 注意不能寫在迴圈裡
}

練習七:回傳陣列裡面所有小於 n 的數的數量

請寫出一個函式 findSmallCount,接收一個陣列跟一個數字 n,回傳有多少個數小於 n。

findSmallCount([1, 2, 3], 2) 預期回傳值:1

findSmallCount([1, 2, 3, 4, 5], 0) 預期回傳值:0

findSmallCount([1, 2, 3, 4], 100) 預期回傳值:4

解法:

// 檢查陣列中每個數字是否小於 n:

function findSmallCount(arr, n) {
    var counter = 0
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < n){
            counter++
        }
    }
    return counter
}
// 或使用 filter() 函數:

function findSmallCount(arr, n) {
    return arr.filter(function(item) {
        return item < n        // 所有小於 n 的數
    }).length                  // 所有小於 n 的數的數量
}

練習八:回傳陣列裡面所有小於 n 的數的總和

請寫一個函式 findSmallerTotal,接收一個陣列以及數字 n,回傳陣列裡面所有小於 n 的數的總和。

findSmallerTotal([1, 2, 3], 3) 正確回傳值:3

findSmallerTotal([1, 2, 3], 1) 正確回傳值:0

findSmallerTotal([3, 2, 5, 8, 7], 999) 正確回傳值:25

findSmallerTotal([3, 2, 5, 8, 7], 0) 正確回傳值:0

解法:

function findSmallerTotal(arr, n) {
    var total = 0
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < n) {
            total += arr[i]
        }
    } 
    return total
}

練習九:回傳陣列裡面所有小於 n 的數

請寫一個函式 findAllSmall,接收一個陣列跟一個數字 n,回傳一個裡面有所有小於 n 的數的陣列(需按照原陣列順序)。

findAllSmall([1, 2, 3], 10) 正確回傳值:[1, 2, 3]
findAllSmall([1, 2, 3], 2) 正確回傳值:[1]
findAllSmall([1, 3, 5, 4, 2], 4) 正確回傳值:[1, 3, 2]

解法:

function findAllSmall(arr, n) {
    var answer = []
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] < n) {
            answer.push(arr[i])
        }
    } 
    return answer
}
// 或使用 filter() 函數:

function findAllSmall(arr, n) {
    return arr.filter(function (item) {
        return item < n
    })
}

練習十:回傳陣列總和

請寫一個 function sum,接收一個陣列並回傳陣列中數字的總和。

sum([1, 2, 3]) 預期回傳值:6

sum([-1, 1, 2, -2, 3, -3]) 預期回傳值:0

解法:

方法一

function sum(arr) {
    var total = 0
    for (var i = 0; i < arr.length; i++) {
        total += arr[i]
    }
    return total
}

方法二

也可利用 .reduce(function) 來解題,reduce() 函式作用如下:

function(accumulator, currentValue) {
    return currentValue + accumulator
}

accumulator(累積器):記憶起來的變數
currentValue:現在的值
在這個函式 return 的值,會成為下一個 accumulator 參數

以練習時為例:

function sum(arr) {
    return arr.reduce (function(accumulator, value) {
        return accumulator + value
    })
}

sum([1, 2, 3])             // 回傳 6
sum([-1, 1, 2, -2, 3, -3]) // 回傳 0

也可設定 accumulator 的初始值,預設值為 0:

function sum(arr) {
    return arr.reduce (function(accumulator, value) {
        return accumulator + value
    }, 10)                        // 初始值為 10
}

sum([1, 2, 3])             // 回傳 16
sum([-1, 1, 2, -2, 3, -3]) // 回傳 10

方法三

也可以使用 forEach() 來解題,和 map() 類似,兩種函式均可「用來存取陣列中的每個元素」。差別在於 forEach() 不用進行 return。

而這個方法和 reduce() 的差異在於「需在外部宣告變數」,用來存取狀態。

function sum(arr) {
    var total = 0                       // 宣告變數
    arr.forEach(function(value) {
        total += value
    })
    return total
}

拿掉宣告變數,並在 function 增加參數來存取,就變成 reduce() 函式了:

function sum(arr) {
    return arr.reduce(function(total, value) {
        return total + value           // 用 return 來存取 total 的值
    })
}