# U1.1、 先別急著寫 leetcode
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
學著不要太急著寫程式碼,寫程式和寫程式碼是兩回事,文章和寫字也是兩回事,在腦中想怎麼寫。
---
## 寫程式的方法:
第一步,先想解法,像是寫文章一樣在腦中構思 (蠻花時間) 。
第二步,將解法轉成程式碼。
## 解題分成:
用想的就知道解開方法。
1. 解得開但是花時間。
2. 解開且有效率。
3. 解不開,因為沒想法去轉換成程式碼。
光想就想不出來怎麼解。
## 解題步驟:
1. 大概想解法。
2. 解法寫成虛擬碼 pseudo code (熟練後跳過) 。
3. 把虛擬碼翻譯成程式碼。
---
# U1.2、 虛擬碼 (pseudo code)
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
用抽象的方式表示解法的方式。
---
寫出一行寫出一行行的執行步驟:
1. 一行只做一件事情,至多兩件。
2. 善用跳轉,讓他重複執行。
敘述 > 如果怎樣怎樣 > 重複。
---
## 讓 1 到 100 之間的偶數全印出來~
1. 敘述: 讓 i 成為 1 , 為設置初始條件。
2. 如果 i >100 就結束,判斷是不是該結束這個程式。
3. 印出 i , 做事情,要判斷偶數; 變成如果 i 是偶數就印出 i 。
4. i = i+1 、把 i+1 , 少掉這步驟其他步驟就不會結束了。
5. 跳回第二行,重複動作。
for(i = 1; i<100; i++) {
console.log(++i)
}
if (i % 2 ===0)
console.log(i)
# U1.3、 寫出虛擬碼 (pseudo code)
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
在程式碼及人的想法中的橋樑,用抽象的方式來表示,長得很像程式碼。
## 一步一腳印的虛擬碼
試著印出 100 。
將想出來的步驟:
1. 讓 i 成為 1 。
2. 如果 i >100 就結束。
3. 印出 i 。
4. i = i+1 。
5. 跳回第二行。
變成英文:
1. let i = 1
2. if i>100 then exit
3. print i
4. i = i+1
5. jump to line 2
然後是更像程式碼的虛擬碼:
1. for (i from 1 to 100) do
2. print i
3. end for
---
# U1.4、 實戰: 印出 1-100 奇數
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
1. 敘述: 讓 i 成為 1 , 為設置初始條件。
2. 如果 i >100 就結束,判斷是不是該結束這個程式。
3. 印出 i , 做事情,要判斷奇數; 變成如果 i 是奇數就印出 i 。
4. i = i+1 、把 i+1 , 少掉這步驟其他步驟就不會結束了。
5. 跳回第二行,重複動作。
---
1. for (i from 1 to 100) do
2. if (n mod 2 === 1) then
3. print i
4. end if
5. end for
第二行 if 開始到 end if 是一個區塊,來進行條判斷、做事情。
而從第一行開始到最後一行 end for 也是區塊。
mod 是取餘數。
自己 try 的實際寫法:
for(var i = 1; i<100; i++) {
console.log(i++)
}
if (i % 2 != 0 && i < 100)
console.log(i)
有區塊的話可以縮排,空兩行,比較好讀。
---
# U1.5、 實戰: fizz buzz
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
題目
給一個數字 n
印出 1~n
但如果碰到 3 的倍數,改印出 Fizz
碰到 5 的倍數則改印 Buzz
若同時是 3 和 5 的倍數則印出 FizzBuzz
虛擬碼:
for(i from 1 to n) do
end for
執行:
for (i from 1 to n) do
if (i % 15 === 0) print "FizzBuzz"
else if (i % 3 === 0) print "Fizz"
else if (i % 5 === 0) print "Buzz"
end for
---
# U1.6、 實戰: 找最小值
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
一堆撲克牌,一張一張翻開,找最小值:
let 最小的牌 = 第一張[0]
for (i from 1 to n-1) do
//從第一張開始翻 , array 是從 0 開始所以-1 ;
翻開第 i 張牌
if (第 i 張牌比最小牌的還小) do
最小的牌=第 i 張牌
end if
end for
做一件事情做很多次,對每張牌判斷是不是比翻開的已知最小張小。
---
# U1.7、 Project 1
###### tags: `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/15`
用虛擬碼解解看。
1. 字串反轉
怎麼把字串一個字一個字印出來?
給一個字串 str,請輸出 str 反過來的結果
範例輸入:hello
範例輸出:olleh
try:
讓一個 str =''
讓字串在哪裡可以執行
起始是 0 ,for( i from n-1 到最後一個0) do
讓 str = str + str[i]
印出 str
解:
let s = ''
for(i from n-1 to 0)do
s+=str[i]
end for
printstr[i]
可以印出倒過來的字串(字串長度 n - 1) ;
把事情反過來做,原本是 0 到 n-1 , 因此從 n-1 到 0
先別印出來,在最外面宣告個變數讓字串存起來。
在迴圈內把每個字加倒 s 上面。
PS. 可以用 str[i] 取得第 i 個字,例如說 str="abc",str[0] 就是 'a'
---
2. 陣列總和
給一個陣列 arr,裡面全都包含了數字(整數),請輸出陣列加總的結果(總和保證不超過 int 範圍)
範例輸入:[1, 2, 3]
範例輸出:6
try:
0 是整數因此要包含 0
讓一個 sum = 0
起始是 0 , for(i from 0 to n-1 ) do
let sum = sum+arr[i]
end for
印出 sum
解:
結構和反轉字串類似。
![](https://i.imgur.com/oZ4FZnc.png)
左邊反轉字串,右邊陣列總和。
---
3. 找最大值
給一個陣列 arr,裡面全都包含了數字(整數),請輸出陣列中的最大值
範例輸入:[1, 2, 3]
範例輸出:3
try:
讓最大的牌 = arr[0]
for(i from 0 to n-1) do
翻開第i張牌
if (第 i 張牌比最大牌的還大) do
if(arr [i] > max) do
最大的牌= arr 的第 i 張牌
end if
end for
印出 max
解:
跟找最小值類似。
![](https://i.imgur.com/5xLr3wt.png)
左邊找最小值,右邊找最大值。
---
** 圖片均為上課教材中所擷取供本人學習使用。
---