練習八:回傳陣列裡面所有小於 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 sum = 0
for (i=0; i<arr.length; i++) {
if (arr[i] < n) {
sum += arr[i]
}
}
return sum
}
console.log(findSmallerTotal([1, 2, 3], 3))
- 在解這題的時候,我發現我的想法好雞肋,我的想法是:
先找出所有小於 n 的數,再把這些數放進陣列裡面,再把那個陣列加起來。老師的解答寫得好簡單,我好像每次解題都不夠直接,假設現在題目要我求總和,我應該就把目標放在總和就好了。
我幹嘛兜那個多圈,我又不是林宥嘉。
練習九:回傳陣列裡面所有小於 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 (i = 0; i < arr.length; i++){
if (arr[i] < n) {
answer.push(arr[i])
}
}
return answer
}
console.log(findAllSmall([1, 3, 5, 4, 2], 4))
- 在解這題的時候,學到了要怎麼把陣列裡面的數放進另一個陣列,首先我要有一個空的陣列,然後用
answer.push(arr[i])
把他們放進去,這行程式碼我還呆呆地在前面寫了一個不知所云的console.log
練習十:回傳陣列總和
請寫一個 function sum,接收一個陣列並回傳陣列中數字的總和。
sum([1, 2, 3]) 預期回傳值:6
sum([-1, 1, 2, -2, 3, -3]) 預期回傳值:0
function sum(arr) {
var answer = 0
for (i = 0; i < arr.length; i++) {
answer += arr[i]
}
return answer
}
console.log(sum([-1, 1, 2, -2, 3, -3]))
- 內建的陣列函式,叫做 reduce: 從影片 JS101 -> 請自己想過、試過再來看這些講解影片 -> 練習十:回傳陣列總和 2:28 開始
假設練習十用 reduce 這個方法解題,就變成下面的樣子
function sum(arr) {
return arr.reduce(function(accumulator, currentValue) {
return accumulator + currentValue
})
}
console.log(sum([1, 2, 3, 4, 5]))
//accumulator, currentValue 可以自己取名稱
- ALG101:首先要習慣 LIOJ 的格式,所以先看操作影片,其中卡住的地方是我不知道為什麼要寫
var tmp = lines[0].split(' ')
,研究的結果發現,這是在規定格式,最後的程式碼應該長這樣
A+B
Description
每一個 Online Judge 都會有的基本題目,讓你熟悉 OJ 的使用方式。
給定兩個正整數 a 與 b,輸出 a + b 的結果。
Input
0 <= a, b <= 2^30
Output
兩數相加後的結果
var readline = require('readline');
var lines = []
var rl = readline.createInterface({
input: process.stdin
});
rl.on('line', function (line) {
lines.push(line)
});
rl.on('close', function() {
solve(lines)
})
// 從這裡以上的程式碼都可以複製貼上,只要改下面的就好了。
// 這個題目可以想成是「寫一個叫做 solve 的函式,接收一個陣列 lines,要輸出兩數相加 a + b」
function solve(lines) {
var tmp = lines[0].split(' ') //陣列 lines 第一個值,後面用空白分開
console.log(Number(tmp[0])+Number(tmp[1]))//把陣列裡面的第一個數加上第二個數就是答案,但是要記得把他們轉成數字
}
- 我覺得 LIOJ 難的地方在於它的格式,並不是解完程式碼可以跑就好了,要在那個環境下符合題目的格式,像是輸入總共三行,第一個數跟第二個數用空白分割,而且還要讓程式碼去跑這三行,寫這些東西才是比較難的地方,也就是說,我應該要先把格式寫出來,然後再用大括號把我要做的事情包起來。
-> 先照顧格式然後再照顧內容
數字比大小
Description
輸入一共有許多行,每一行都包含兩個正整數 a, b
請輸出這兩個之中比較大的那個數字
若是碰到 a=b=0 代表輸入結束
Input
用空格隔開的兩正整數 a 與 b
0 <= a, b <= 2^{31}-10<=a,b<=2
31
−1
Output
針對每一筆測試資料,請輸出比較大的那個數字,若是兩個一樣大則輸出任意一個數字皆可
若是碰到 a=b=0 代表輸入結束,請勿做任何處理
//像這個寫法就是錯的,因為這樣只能跑一次而已
function solve(lines) {
var tmp = lines[0].split(' ')
if (tmp[0] > tmp[1]) {
return tmp[0]
} else if (tmp[0] < tmp[1]){
return tmp[1]
} else {
return
}
}
console.log(tmp)
var readline = require('readline');
var lines = []
var rl = readline.createInterface({
input: process.stdin
});
rl.on('line', function (line) {
lines.push(line)
});
rl.on('close', function() {
solve(lines)
})
// 寫一個叫做 solve 的函式,接收陣列 lines,這些陣列分成一行一行的。
// 要輸出比較大的那個數,如果 a === b 就不要執行
function solve(lines) {
for (var i=0; i <lines.length; i++){
var tmp = lines[i].split(' ')
var a = Number(tmp[0])
var b = Number(tmp[1])
if (a === 0 && b === 0) {
return
}
if (a > b) {
console.log(a)
} else {
console.log(b)
}
}
}
2. 陣列總和
給一個陣列 arr,裡面全都包含了數字(整數),請輸出陣列加總的結果(總和保證不超過 int 範圍)
範例輸入:[1, 2, 3]
範例輸出:6
function sum(arr) {
var total = 0
for (i=0;i<arr.length;i++) {
total += arr[i]
}
return total
}
console.log(sum([1, 2, 3, 4, 5]))