---
# System prepended metadata

title: U1.1、 先別急著寫 leetcode
tags: [Lidemy心得, 2020七月第三週, 進度筆記, ALG 101, 7/15, JavaScript]

---

# 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)
左邊找最小值，右邊找最大值。


---

** 圖片均為上課教材中所擷取供本人學習使用。

---