LIOJ 1033:最近點對
解題想法:這一題是平面距離的延伸,題目要求的是要求哪兩個座標距離最近,也就是最小值的意思,看到這裡我應該要聯想到之前做過的撲克牌,要設一個變數為 Infinity
首先要把所有的數都取出來,n 要記得轉成數字;座標要取 lines 的每一行,每個座標用空格分割,把這些值當成一個物件放進陣列裡面
這題我要多做幾次。
const { format } = require('path');
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)
})
function solve(lines) {
let n = Number(lines[0])
//接下來取得資料的方式很不熟悉
let dots = []//把所有座標放進去
for(let i=1; i<lines.length; i++) {
let temp = lines[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++){
for(let j=i+1; j<dots.length; j++) {
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
}
}
}
}
//這裡是題目要求的輸出方式
if (ans.x1 > ans.x2) {
console.log(ans.x2 + ' ' + ans.y2)
console.log(ans.x1 + ' ' + ans.y1)
} else if (ans.x1 < ans.x2) {
console.log(ans.x1 + ' ' + ans.y1)
console.log(ans.x2 + ' ' + ans.y2)
} else {
if (ans.y1 > ans.y2) {
console.log(ans.x2 + ' ' + ans.y2)
console.log(ans.x1 + ' ' + ans.y1)
} else {
console.log(ans.x1 + ' ' + ans.y1)
console.log(ans.x2 + ' ' + ans.y2)
}
}
}
//這個是計算距離的公式
function distance(x1, y1, x2, y2) {
let result = Math.sqrt(
Math.abs(x1 - x2) * Math.abs(x1 - x2) +
Math.abs(y1 - y2) * Math.abs(y1 - y2)
)
return result
}
Unit6:內建函式做做看
- map: 是一個內建函式,可以用來轉換陣列;map 會把陣列裡面所有的元素傳進你指定的函式,再輸出一個新的陣列
function map(arr, callback) {//傳進一個陣列跟函式
let result = []
for (let i = 0; i < arr.length; i++) {
result[i] = callback(arr[i])
}
return result
}
console.log(map([1, 2, 3], double))
參考資料:
Day13【ES6 小筆記】Array.map() - 處理陣列最佳選擇
箭頭函式:Day04【ES6 小筆記】箭頭函式 - 基礎使用範例(Arrow function )
- String.repeat: 'abc'.repeat(3) // abcabcabc
function repeat(str, t) {
let result = ''
for(i=1; i<=t; i++) {
result += str
}
return result
}
console.log(repeat('abc', 2)) //abcabc
- Array.lastIndexOf:
indexOf 介紹
console.log([1, 2, 3, 1].indexOf(4))
//這裡會回傳 -1,表示沒有 ‘4‘ 這個值
console.log([1, 2, 3, 1].indexOf(2))
//回傳 ‘1’,表示數字 2 在陣列的第 1 個元素
console.log([1, 2, 3, 1].indexOf(1))
//回傳 ‘0’,表示數字 1 在陣列的第 0 個元素
//只會找第一個出現的數字
lastIndexOf:在陣列由後往前尋找裡面尋找某個元素
console.log([1, 2, 3, 1].lastIndexOf(1))
//回傳 ‘3’,表示數字在陣列的第 3 個元素
console.log([1, 2, 3, 1].lastIndexOf(3))
//還是一樣回傳 ‘2’,表示數字在陣列的第 2 個元素
//實作 lastIndexOf 函式
function lastIndexOf(arr, target) {
for(i=arr.length - 1; i>=0; i--) {
if(arr[i] === target) {
return i
}
}
return -1
}
console.log(lastIndexOf([1, 3, 5, 3], 3))
Project6 LIOJ 1036:Array reverse
Make an imitation of Array reverse function
- I found the hard part is taking care 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)
})
function solve(lines) {
let numbers = []
for(let i=1; i<lines.length; i++) {
numbers.push(lines[i])
}
let arr = reverse(numbers)
for(let i=0; i<arr.length; i++) {
console.log(arr[i])
}
}
// LIOJ 1036:Array reverse
function reverse(arr) {
let result = []
for(let i=arr.length - 1; i>=0; i--) {
result.push(arr[i])
//這行不可以寫成 result += arr[i],OJ wrong answer
}
return result
}
LIOJ 1037:Array filter
Make an imitation of Array filter function
// 這題 callback 會是一個 function,但難度會比較高
// 若是做不出來,也可以調整參數
- 我的解法,因為做不出來 callback 這個 function,覺得函式傳來傳去有點不習慣
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)
})
function solve(lines) {
let target = lines[0]
let arr = []
for(let i=2; i<lines.length; i++) {
arr.push(lines[i])
}
let result = filter(arr)
for(let i=0; i<result.length; i++) {
console.log(result[i])
}
}
function filter(arr) {
let ans = []
for(let i=0; i<arr.length; i++) {
if(arr[i] !== lines[0]) {
ans.push(arr[i])
}
}
return ans
}
- 正解
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)
})
function solve(lines) {
let target = Number(lines[0])
let arr = []
for(let i=2; i<lines.length; i++) {
arr.push(Number(lines[i]))
}
let newArr = filter(arr, function(element){
return element !== target
})
for(let i=0; i<newArr.length; i++) {
console.log(newArr[i])
}
}
function filter(arr, callback) {
let result = []
for(let i=0; i<arr.length; i++) {
if(callback(arr[i])) {
result.push(arr[i])
}
}
return result
}
LIOJ 1038:Array indexOf
- Make an imitation of Array indexOf function
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)
})
function solve(lines) {
let target = Number(lines[0])
let arr= []
for(let i=2; i<lines.length; i++) {
arr.push(Number(lines[i]))
}
console.log(indexOf(arr, target))
}
// LIOJ 1038:Array indexOf
function indexOf(arr, searchElement) {
for(let i=0; i<arr.length; i++) {
if(arr[i] === searchElement) {
return i
}
}
return -1
}
LIOJ 1039:Array fill
- Make an imitation of Array fill function
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)
})
function solve(lines) {
let target = Number(lines[0])
let arr = []
for(let i=2; i<lines.length; i++) {
arr.push(Number(lines[i]))
}
let result = fill(arr, target)
for(let i=0; i<result.length; i++) {
console.log(result[i])
}
}
// LIOJ 1039:Array fill
function fill(arr, value) {
let ans = []
for(let i=0; i<arr.length; i++) {
ans[i] = value
}
return ans
}
LIOJ 1040:Array join
- 這題雖然以前做過了,但做到最後還是有點卡卡的
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)
})
function solve(lines) {
let str = lines[0]
let arr = []
for(let i=2; i<lines.length; i++) {
arr.push(lines[i])
}
console.log(join(arr, str))
}
// LIOJ 1040:Array join
function join(arr, separator) {
let result = ''
for(let i=0; i<arr.length; i++) {
if(i === arr.length - 1) {
result += arr[i]
} else {
result += arr[i] + separator
}
}
return result
}
//另外一個比較簡單的邏輯是,把 1 以及 !2!3 分開來看
//天吶,有夠聰明的想法!
function join(arr, separator) {
let result = arr[0]
for(let i=1; i<arr.length; i++) {
result += separator + arr[i]
}
return result
}