let 最小的牌 = 第一張牌 for (i from 1 to n) do // n為撲克牌總數 翻開第 i 張牌 if (第 i 張排比最小牌的還小) do 最小的牌 = 第 i 張牌 end if end for
將上述解法翻譯成陣列:
1 2 3 4 5 6
let min = arr[0] // min是陣列中最小值,0代表array第一個元素 for (i from 0 to n-1) do // n-1:因為array的 index(索引)所以從 0 開始 if (arr[i] < min) do // 如果第 i 個元素比最小值還小 min = arr[i] // i 就變成最小值 end if end for
<script> debugger let arr = [2, 7, 5]; let max = arr[0]; for (let i=0; i<arr.length; i++) { if (arr[i] > max) { max = arr[i]; } } console.log(max); </script>
functionisPrime(n) { if (n === 1) { returnfalse; } for (let i = 2; i < n; i += 1) { if (n % i === 0) { returnfalse; } } returntrue; }
// 前面已宣告過 lines,這裡改用 input 作為參數,拿取內容 lines functionsolve(input) { let n = Number(input[0]); for (let i = 1; i <= n; i += 1) { printTree(i, n); } for (let i = 1; i <= n - 1; i += 1) { printBottom(n); } }
functionprintTree(i, n) { console.log(repeat(" ", n - i) + repeat("*", 2 * i - 1)); }
functionprintBottom(n) { console.log(repeat(" ", n - 1) + "|"); }
functionrepeat(str, n) { let result = ""; for (let i = 1; i <= n; i += 1) { result += str; } return result; }
// 前面已宣告過 lines,這裡改用 input 作為參數,拿取內容 lines functionsolve(input) { let N = Number(input[0]); let M = Number(input[1]); // 產生 1~N for (let k = 1; k <= N; k += 1) { // 產生 1~M for (let i = 1; i <= M; i += 1) { console.log(k + "*" + i + "=" + k * i); // 也可寫成 console.log(`${k}*${i}=${k*i}`) } } }
functionisNarcissistic(n) { // 幾位數,宣告一個 m = n let m = n let digits = digitsCount(m) let sum = 0
while (m != 0) { let num = m % 10 // 可改成 Math.pow(num, digits) => num 的 digits 次方 sum += num**digits m = Math.floor(m / 10) }
// 可簡化成:return sum === n if (sum === n) { returntrue } elseif { returnfalse } }
// 應用上方兩個函式即可完成輸出 functionsolve(input) { // 輸入 5 200 => ['5', '200'] const temp = input[0].split(' '); let n = Number(temp[0]); let m = Number(temp[1]); for (let i = n; i <= m; i += 1) { if (isNarcissistic(i)) { console.log(i); } } }
也可以把「數字轉成字串」,直接用字串來判斷幾位數:
例如:
1 2
'1234'.length => 4 '1234'.[0] => 1
1 2 3 4 5 6 7 8 9 10 11 12
// 實際操作 functionisNstr(n) { // 數字 + 空字串 => 字串 // 或是 n.toString()、String(n) let str = n + '' let digits = str.length let sum = 0 for (let i = 0; i < str.length;; i+= 1) { sum += Number(str[i])**digits } return sum === n }
實戰:判斷等差數列
判斷 [1, 3, 5, 7, 9] 是否為等差數列
解題技巧:
先求公差:arr[1] - arr[0]
再判斷 arr[i] - arr[i-1] 是否等於公差
1 2 3 4 5 6 7 8 9 10 11 12 13 14
// 判斷是否為等差數列 functionisValid(arr) { let d = arr[1] - arr[0]; for (let i = 1; i < arr.length; i += 1) { if (arr[i] - arr[i - 1] !== d) { returnfalse; } } returntrue; }
function isValid(arr) { // 涵蓋邊界條件,可避免不合法的存取 if (arr.length <= 1) return true let d = arr[1] - arr[0] for (let i = 1; i < arr.length; i += 1) { if (arr[i] - arr[i-1] !== d) { return false } } return true }
實戰:數字位數加總
與「判斷水仙花數」題型類似。
解法一:數學解
1 2 3 4 5 6 7 8 9 10 11 12 13
functionaddDigits(n) { // 若 n 為負數,乘上 -1 變成正數 if (n < 0) { n = n * -1; } let sum = 0; while (n != 0) { sum += n % 10; n = Math.floor(n / 10); } return sum; } console.log(addDigits(123));
解法二:字串偷吃步
1 2 3 4 5 6 7 8 9
functionaddDigits(n) { let str = n + ""; let sum = 0; for (let i = 0; i < str.length; i += 1) { sum += Number(str[i]); } return sum; } console.log(addDigits(123));
functionisSquare(n) { let r = Math.floor(Math.sqrt(n)); return r * r === n; }
// 前面已宣告過 lines,這裡改用 input 作為參數,拿取內容 lines functionsolve(input) { const n = Number(input[0]); let sum = 0; for (let i = 1; i <= n; i += 1) { if (isSquare(i)) { sum += i; } } console.log(sum); }
functionsolve(input) { let t = Number(input[0]); for (let i = 1; i <= t; i += 1) { let start = (i - 1) * 4 + 1; let x1 = Number(input[start]); let y1 = Number(input[start + 1]); let x2 = Number(input[start + 2]); let y2 = Number(input[start + 3]); console.log(distance(x1, y1, x2, y2)); } }
functionsolve(input) { let n = Number(input[0]); let dots = []; for (let i = 1; i < input.length; i += 1) { let temp = input[i].split(" "); dots.push({ x: Number(temp[0]), y: Number(temp[1]), }); }
let min = Infinity; // 最短距離先設一個最大值 let ans = null; for (let i = 0; i < dots.length; i += 1) { for (let j = i + 1; j < dots.length; j += 1) { let dis = distance(dots[i].x, dots[i].y, dots[j].x, dots[j].y); if (dis < min) { min = dis; ans = { x1: dots[i].x, y1: dots[i].y, x2: dots[j].x, y2: dots[j].y, }; } } }
functionsolve(input) { let n = Number(input[0]); let str = input[1]; let result = ""; for (let i = 0; i < str.length; i += 1) { result += ceaserCipher(n, str[i]); } console.log(result); }
// 反轉陣列 functionreverse(arr) { let result = []; for (let i = arr.length - 1; i >= 0; i -= 1) { result.push(arr[i]); // 反轉 => [3, 2, 1] } return result; }
// 處理輸入 functionsolve(input) { let numbers = []; for (let i = 1; i < input.length; i += 1) { numbers.push(input[i]); // [1, 2, 3] } // 傳進 reverse 函式,並印出結果 let arr = reverse(numbers); for (let i = 0; i < arr.length; i += 1) { console.log(arr[i]); } }
也可以直接在處理輸入後,直接輸出翻轉後的結果:
1 2 3 4 5 6 7 8 9 10 11
// 處理輸入 functionsolve(input) { let numbers = []; for (let i = 1; i < input.length; i += 1) { numbers.push(input[i]); // [1, 2, 3] }
for (let i = numbers.length - 1; i >= 0; i -= 1) { console.log(numbers[i]); } }
functionfilter(arr) { let result = []; for (let i = 2; i < arr.length; i += 1) { // 跳過不符合的數字 if (arr[i] == arr[0]) { continue; } result.push(arr[i]); } return result; }
// 處理輸入 functionsolve(input) { let numbers = []; for (let i = 0; i < input.length; i += 1) { numbers.push(input[i]); // [3, 5, 1, 3 , 3, 2, 8] } // 傳進 filter 函式,並印出結果 let arr = filter(numbers); for (let i = 0; i < arr.length; i += 1) { console.log(arr[i]); } }
functionfilter(arr, callback) { let result = []; for (let i = 0; i < arr.length; i += 1) { // 跳過不符合的數字 if (callback(arr[i]) === true) { result.push(arr[i]); } } return result; }
// 處理輸入 functionsolve(input) { // 排除目標 let target = Number(input[0]); let arr = []; for (let i = 2; i < input.length; i += 1) { arr.push(Number(input[i])); // [1, 3 , 3, 2, 8] } // 傳進 filter 函式,留下不等於 target 的值 // 也可寫成 filter(arr, element => element !== target) let newArr = filter(arr, function (element) { return element !== target; }); for (let i = 0; i < newArr.length; i += 1) { console.log(newArr[i]); } }
// LIOJ 1039:Array fill functionfill(arr, value) { let result = []; for (let i = 0; i < arr.length; i += 1) { // 陣列每個元素會被取代成 value,也可寫成 result[i] = value result.push(value); } return result; }
// 處理輸入 functionsolve(input) { let target = Number(input[0]); let arr = []; for (let i = 2; i < input.length; i += 1) { arr.push(Number(input[i])); // => [1, 2, 3] } let newArr = fill(arr, target); for (let i = 0; i < newArr.length; i += 1) { console.log(newArr[i]); } }
// LIOJ 1040:Array join functionjoin(arr, separator) { let result = ""; for (let i = 0; i < arr.length; i += 1) { result += arr[i]; if (i < arr.length - 1) { result += separator; } } return result; }
// 處理輸入 functionsolve(input) { const str = input[0]; let arr = []; for (let i = 2; i < input.length; i += 1) { arr.push(input[i]); // [1, 2, 3] } console.log(join(arr, str)); }
或是把字串 1!2 3 看成 1 !2!3,迴圈內就不用再進行判斷:
1 2 3 4 5 6 7
functionjoin(arr, separator) { let result = arr[0]; for (let i = 1; i < arr.length; i += 1) { result += separator + arr[i]; } return result; }
LIOJ 1041:String trim
1
LIOJ 1042:String toLowerCase
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// LIOJ 1042:String toLowerCase functiontoLowerCase(str) { let result = ""; for (let i = 0; i < str.length; i += 1) { if (str[i] >= "A" && str[i] <= "Z") { let code = str.charCodeAt(i); result += String.fromCharCode(code + 32); } else { result += str[i]; // 若不是大寫就直接加到字串 } } return result; }
// LIOJ 1044:String padEnd functionpadEnd(str, targetLength, padString) { if (str.lenght >= targetLength) { return str; } // 從 'S 字串長度 + 1' 開始填充,直到預期字串長度 while (str.length < targetLength) { for (let i = 0; i < padString.length; i += 1) { str += padString[i]; // 若 S 達到預期字串長度,則結束迴圈 if (str.length === targetLength) { return str; } } } }
// 處理輸入 functionsolve(input) { let S = input[0]; let target = Number(input[1]); // 預期字串的最後長度 let padString = input[2]; // 要填充的字串 console.log(padEnd(S, target, padString)); }
LIOJ 1045:String slice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
// LIOJ 1045:String slice functionslice(str, beginIndex, endIndex) { let result = ""; for (let i = beginIndex; i < endIndex; i += 1) { result += str[i]; } return result; }
// 處理輸入 functionsolve(input) { let str = input[0]; let start = Number(input[1]); let end = Number(input[2]); console.log(slice(str, start, end)); }
補充:Lidemy OJ 解題方式
有三種方式可以驗證輸出:
直接在 Command Line 介面直接執行 node index.js,即可直接輸入數字,按 ctrl+D 輸出結果(Windows 無法執行)
var readline = require('readline'); var rl = readline.createInterface({ input: process.stdin });
var lines = []
// 讀取到一行,先把這一行加進去 lines 陣列,最後再一起處理 rl.on('line', function (line) { lines.push(line) });
// 輸入結束,開始針對 lines 做處理 rl.on('close', function () { solve(lines) })
function solve(lines) { var arr = lines[0].split(' ') // 注意需要取陣列! var a = Number(arr[0]) var b = Number(arr[1]) if (a === b) { console.log('Yes') } else { console.log('No') } }