D26_ALG101-Unit 5 + Unit 6


Posted by Christy on 2021-05-14

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
}









Related Posts

用 Javascript 進行簡單線性迴歸分析

用 Javascript 進行簡單線性迴歸分析

Chapter 1. 重構:第一個範例

Chapter 1. 重構:第一個範例

Express

Express


Comments