| 寫程式前,先考驗閱讀能力
輸入範圍的重要
| 不同範圍=不同輸入,沒有講清楚範圍就問清楚
常見限制
- 空間限制
- 空間估算 : int ( 4 bytes)、double與JS的number ( 8 bytes)
- Recall : 1 KB =1024 bytes
同理,10億個數字需要的儲存空間
8 * 1e8 /1024 = 781200 KB /1024 = 7600 MB = 7.4GB
- 時間限制
- 先求有再求好,相關重點
<big O >
- 先求有再求好,相關重點
- 型態限制
輸出入方式
| 分成兩類,函式、標準輸出入
- 函式
- 標準輸出入 :
cat input.txt | node code.js
- 用白話文改寫,並提出可能有問題的地方
HW(1)、LIOJ 1010:靈魂伴侶
- 輸入兩個正整數,如果兩個數值相等,輸出YES,反之輸出NO
- 數字範圍上沒有該注意的地方
HW(2)、LIOJ 1015:音速小子
- 把一個數字承上340
- 數字範圍上沒有該注意的地方
HW(3)、LIOJ 1017:貪婪的小偷
- 取價值最高的 C 項物品
- 數字範圍上沒有要注意的地方
寫程式的重要
(一)、函式填空法
- 先寫架構,剩下再處理細節。
//虛擬碼
for (i from 1 to n-1) do
if( arr[i] is Prime) do
print "Prime"
else do
print "Composite"
end if
end for
// 程式碼 (變成函式
for (let i=0;i<arr.lenght;i++){
if(isPrime([arr[i])){
console.log("Prime")}
else {
console.log("Composite")}
}
function isPrime(n){
// todo
if(n===1) return false
for(var i=2 ;i<n;i++){
if(n%i===0){
return false}
}
return true
}
(二)、簡化法
- 難的解不出來,先解簡化版的。
//不會輸出 n 個,就先輸出一個
for(let i=0;i<=n;i++){
console.log("*")
}
//搭配函式填空法
for(let i=0;i<=N;i++){
printStar(i)}
function printStar(n){
let result=""
for(let i=1;i<=n;i++){
result+="*"
}
console.log(result)
}
範例、金字塔
- 規律 :
- 一共有n層
- 第i層有2i-1個星星
- 星星置中
- 需要n-i個空白
//空白 + 星星
for(let i=1;i<=n;i++){
printLayer(i,n) //因為跟兩個都有關,需要兩個參數
}
functon printLayer(i,n){
let str = repeat('',n-1)+repeat('*',2*i-1)
console.log(str)
}
//加一個輔助函式
function repeat(str,n){
let result=""
for(let i=1;i<=n;i++){
result+=str
}
return result
}
-----
// 簡潔一點
function main(n){
for(let i=1;i<=n;i++){
let str=repeat(" ",n-i)+repeat("*",2*i-1)
console.log(str)
}
}
function repeat(str,n){
let s=''
for(let i=1;i<=n;i++){
s+=str
}
return s
}
main(3)