Open zuppachu opened 6 years ago
BMI 值的計算公式為:體重 / (身高^2)。 假設體重是 70,身高是 180(1.8m),BMI 就是 70/(1.8*1.8) = 21。
現在請你寫出一個簡單的 BMI 計算器,用兩個變數代表體重跟身高,算出 BMI 之後判斷 BMI 是落在哪個範圍內並輸出相對應的字串。
體重過輕:BMI < 18.5 正常範圍:18.5 <= BMI < 24 過重:24 <= BMI < 27 輕度肥胖:27 <= BMI < 30 中度肥胖:30 <= BMI < 35 重度肥胖:35 <= BMI
var W = 55
var h = 1.5
var BMI = W / ( (h * h) )
console.log(parseInt(BMI,10))
if ( BMI < 18.5) {
console.log("體重過輕")
} else if ( BMI >= 18.5 && BMI < 24) {
console.log("正常範圍")
} else if ( BMI >= 24 && BMI < 27) {
console.log("過重")
} else if ( BMI >= 27 && BMI < 30) {
console.log("輕度肥胖")
} else if ( BMI >= 30 && BMI < 35) {
console.log("中度肥胖")
} else {
console.log("重度肥胖")
}
(第二次練習,第一次練習和老師詳解都寫在 JS101_practice 內)
請你分別用 for loop 以及 while 迴圈,印出 1~9。
預期輸出: 1 2 3 4 5 6 7 8 9
for (var i=1; i< 10; i++) {
console.log(i)
}
var i = 0
while (i<9) {
i++
console.log(i)
}
var i = 1
while (i<10) {
console.log(i)
i++
}
請寫一個函式叫做 print,接收一個是數字的參數 n,並且印出 1~n。
print(1) 預期輸出:
1
print(3) 預期輸出: 1 2 3
print(9) 預期輸出: 1 2 3 4 5 6 7 8 9
function print(n){
for(var i=1 ; i<=n; i++){
console.log(i)
}
}
print(9)
寫一個函式 star,接收一個參數 n,並印出 n 個 * (禁止使用內建函式 repeat)
star(1) 預期輸出:
*
star(5) 預期輸出:
*****
star(10) 預期輸出:
**********
function star(n){
var print = "*"
var ans = ""
for(var i=1; i<=n; i++){
var ans = ans + print
}
console.log(ans)
}
star(5)
請寫出一個叫做 star 的 function 並且接受一個參數 n,能回傳 n 個 *。
star(1) 會回傳 *
star(5) 會回傳 *****
所以 console.log(star(5)) 的預期輸出是:*****
function star(n){
var print = "*"
var ans = ""
for(var i=1; i<=n; i++){
var ans = ans + print
}
return ans
}
console.log(star(5))
請寫一個叫做 isUpperCase 的 functuon,並且接收一個字串,回傳這個字串的第一個字母是否為大寫。
isUpperCase("abcd") 正確回傳值:false isUpperCase("Abcd") 正確回傳值:true isUpperCase("ABCD") 正確回傳值:true isUpperCase("aBCD") 正確回傳值:false
function isUpperCase(str){
if (str[0] >= "A" && str[0]<="Z") {
return true
} else {
return false
}
}
console.log(isUpperCase("cD"))
請寫一個 function position,接收一個字串並回傳這個字串裡面的第一個大寫字母跟它的 index,若沒有則回傳 -1。
position("abcd") 正確回傳值:-1 position("AbcD") 正確回傳值:A 0 position("abCD") 正確回傳值:C 2
function position (str) {
for(var i=0; i<str.length-1; i++){
if (str[i] >= "A" && str[i]<="Z") {
return (str[i] + " " + i)
}
}
return -1
}
console.log(position("abcd"))
console.log(position("AbcD"))
console.log(position("abCD"))
/*
這次想到 for loop , 但沒想到 return 必須放外面的原因
and str[i] 必須用 + 才能顯示出來
*/
請寫出一個函式 findSmallCount,接收一個陣列跟一個數字 n,回傳有多少個數小於 n。
findSmallCount([1, 2, 3], 2) 預期回傳值:1 findSmallCount([1, 2, 3, 4, 5], 0) 預期回傳值:0 findSmallCount([1, 2, 3, 4], 100) 預期回傳值:4
function find(arr,n){
return arr.filter(function(el){
return el < n
}).length
}
console.log(find([1, 2, 3], 4))
請寫一個函式 findSmallerTotal,接收一個陣列以及數字 n,回傳陣列裡面所有小於 n 的數的總和。
findSmallerTotal([1, 2, 3], 3) 正確回傳值:3 findSmallerTotal([1, 2, 3], 1) 正確回傳值:0 findSmallerTotal([3, 2, 5, 8, 7], 999) 正確回傳值:25 findSmallerTotal([3, 2, 5, 8, 7], 0) 正確回傳值:0
function findSmallerTotal(arr,n){
var sum = 0
for(i=0; i<arr.length; i++){
if(arr[i]<n){
sum += arr[i]
}
}
return sum
}
console.log(findSmallerTotal([1, 2, 3], 3))
請寫一個函式 finaAllSmall,接收一個陣列跟一個數字 n,回傳一個裡面有所有小於 n 的數的陣列(需按照原陣列順序)。
findAllSmall([1, 2, 3], 10) 正確回傳值:[1, 2, 3]
findAllSmall([1, 2, 3], 2) 正確回傳值:[1] findAllSmall([1, 3, 5, 4, 2], 4) 正確回傳值:[1, 3, 2]
function findAllSmall(arr,n){
var newArr = []
for(var i=0; i<arr.length; i++){
if(arr[i]<n){
newArr.push(arr[i])
}
}
return newArr
}
console.log(findAllSmall([1, 2, 3], 2))
console.log(findAllSmall([1, 2, 3], 10))
console.log(findAllSmall([1, 3, 5, 4, 2], 4))
請寫一個 function sum,接收一個陣列並回傳陣列中數字的總和。
sum([1, 2, 3]) 預期回傳值:6 sum([-1, 1, 2, -2, 3, -3]) 預期回傳值:0
function sum(arr){
var count = 0
for(var i=0; i<arr.length; i++){
count = count + arr[i]
}
return count
}
console.log(sum([-1, 1, 2, -2, 3, -3]))
console.log(sum([1, 2, 3]))
請寫出一個 function stars,接收一個參數 n,並且按照規律印出相對應的圖案。
stars(1) 預期輸出:
*
stars(3) 預期輸出:
*
**
***
stars(7) 預期輸出:
*
**
***
****
*****
******
*******
function stars(n){
var ans = ""
for(var i=0; i<n; i++){
ans = ans + "*"
console.log(ans)
}
}
stars(7)
//老師的解法一:
印出1顆星
...
印出n顆星
function printStar(n) {
var result = ''
for (var i=1; j<=i ; j++) {
result += '*'
}
console.log(result)
}
function stars(n) {
for (var i=1; i<=n; i++) {
printStar(i) //印出i顆星
}
}
//解法二:雙重迴圈
function stars(n) {
for (var i=1; i<=n; i++) {
var result = ''
for (var i=1; j<=i; j++) {
result += '*'
}
console.log(result)
}
}
debugger放在流覽器上看
stars(5)
請寫出一個 function makeStars,接收一個參數 n,並且根據規律「回傳」字串
makeStars(1) 正確回傳值:*
makeStars(2) 正確回傳值:*\n**
makeStars(5) 正確回傳值:*\n**\n***\n****\n*****
//老師解法 一
function star(i) {
var result = ""
for(var j=1; j<=i; j++){
result += '*'
}
return result
}
function makeStars(n) {
var arr = []
for(var i=1; i<=n; i++){
arr.push(star(i))
}
return arr.join('\n')
}
console.log(makeStars(5))
//解法二
function star(i) {
var result = ""
for(var j=1; j<=i; j++){
result += '*'
}
return result
}
function makeStars(n) {
var result = ""
for(var i=1; i<=n; i++){
result += star(i)
if(i !==n){ //為了在最後一行不加空白
result += '\n'
}
}
return result
}
console.log(makeStars(5))
請寫出一個函式 stars2,接收一個參數 n,並依照規律印出圖形。
stars2(1) 預期輸出:
*
stars2(3) 預期輸出:
*
**
***
**
*
stars2(5) 預期輸出:
*
**
***
****
*****
****
***
**
*
// 拆解2 把 star(i) 抓出來單獨寫
function star(i){
var ans = ""
for(var j=1; j<=i; j++){
ans += "*"
}
return ans
}
// 拆解1
function stars2(n){
for(var i=1; i<=n; i++){
console.log(star(i))
}
for(var i=n-1; i>0; i--){
console.log(star(i))
}
}
stars2(3)
請寫一個函式 table,接收一個數字 n,印出 n1 ~ n9 的結果。
table(1) 預期輸出:
1*1 = 1
1*2 = 2
1*3 = 3
1*4 = 4
1*5 = 5
1*6 = 6
1*7 = 7
1*8 = 8
1*9 = 9
table(7) 預期輸出:
7*1 = 1
7*2 = 14
7*3 = 21
7*4 = 28
7*5 = 35
7*6 = 42
7*7 = 49
7*8 = 56
7*9 = 63
function table(n){
for(var j=1; j<=9; j++){
console.log(n + '*' + j + ' = ' + n*j)
}
}
table(2)
table(7)
請寫出一個 function table9to9,並列出 11 ~ 99。
table9to9() 預期輸出:
1*1 = 1
1*2 = 2
1*3 = 3
.....
5*1 = 5
5*2 = 10
5*3 = 15
....
9*7 = 63
9*8 = 72
9*9 = 81
function table9to9(){
for(var i=1; i<=9; i++){
for(var j=1; j<=9; j++){
console.log(i + '*' + j + ' = ' + i*j)
}
}
}
table9to9()
老師解法:
function table(n) {
for(var i=1; i<=9; i++) {
console.log(n + '*' + i + '=' + n*i)
}
}
function table9to9(){
for(var i=1; i<=9; i++) {
table(i) //印出i*1 ~ i*9
}
}
table9to9()
費式數列的定義為:第 n 個數等於前兩個數的總和,因此這個數列會長的像這樣:1 1 2 3 5 8 13 21 ....
用比較數學一點的講法,就是:
fib(0) = 0 fib(1) = 1 for n >=2, fib(n) = fib(n-1) + fib(n-2)
現在,請你寫出一個 fib 的函式,回傳位在第 n 個位置的數字
fib(1) 預期回傳值:1 fib(2) 預期回傳值:1 fib(8) 預期回傳值:21
//解法一: 遞迴
function fib(n){
if(n === 0) return 0
if(n === 1) return 1
return fib(n-2)+fib(n-1)
/*遞迴(Recursive):一直不斷回頭呼叫自己
其中最重要:有個終止條件,像 return */
}
console.log(fib(3))
//解法二:迴圈
function fib(n){
var fib = [0,1]
for(var i=2; i<=n; i++){
fib[i] = fib[i-1] + fib[i-2]
}
return fib[n]
}
console.log(fib(8))
請寫出一個函式 reverse,接收一個字串,並且回傳反轉過後的字串。(禁止使用內建函式 reverse)
reverse("abcd") 預期回傳值:dcba reverse("12345aa") 預期回傳值:aa54321
function reverse(str){
var ans = ""
for(var i=str.length-1; i>=0; i--){
ans += str[i]
}
console.log(ans)
}
reverse("abcd")
reverse("12345aa")
//方法二:.reverse() for array
function reverse(str){
var splitStr = str.split('')
var reverseArr = splitStr.reverse()
var joinArr = reverseArr.join('')
return joinArr //要放在function內
}
console.log(reverse("abcd"))
console.log(reverse("12345aa"))
//方法三:上面簡化寫法
function reverse(str) {
return str.split('').reverse().join('')
}
console.log(reverse("zxcvb"))
console.log(reverse("qwer123"))
//方法四:spread syntax (ES6) + reverse() method for arrays
function reverse(str){
return [...str].reverse().join('');
}
console.log(reverse("zxcvb"))
console.log(reverse("qwer123"))
//方法五:reduce() method for arrays
function reverse(str){
return str.split("").reduce((rev, char)=> char + rev, '');
}
console.log(reverse("abcd"))
console.log(reverse("12345aa"))
//方法六:recursion
function reverse(str){
if(str === ""){
return str
}else{
return reverse(str.substr(1)) + str[0]
}
}
console.log(reverse("abcd"))
console.log(reverse("12345aa"))
請寫一個函式 swap,接收一個字串,並且回傳大小寫互換後的字串。
swap("Peter") 預期回傳值:pETER swap("AbCdE") 預期回傳值:aBcDe
function swap(str){
var ans = ""
for(var i=0; i<str.length; i++){
if(str[i] >= "A" && str[i] <= "Z")
ans += str[i].toLowerCase()
if(str[i] >= "a" && str[i] <= "z")
ans += str[i].toUpperCase()
}
return ans
}
console.log(swap("Peter"))
console.log(swap("AbCdE"))
function swap(str){
var ans = ''
for(var i=0; i<str.length; i++) {
if(str[i] >= 'A' && str[i] <= 'Z') {
ans += str[i].toLowerCase()
}else if(str[i] >= 'a' && str[i] <= 'z') {
ans += str[i].toUpperCase()
}else {
ans += str[i]
//如果是符號,就保持原樣
}
}
return ans
}
console.log(swap("Peter"))
console.log(swap("AbCdE"))
//或是寫成這樣,因為 .toLowerCase() 會忽略 數字和符號!
function swap(str){
var ans = ''
for(var i=0; i<str.length; i++) {
if(str[i] >= 'A' && str[i]<= 'Z') {
ans += str[i].toLowerCase()
}else {
ans += str[i].toUpperCase()
}
return ans
}
console.log(swap("Peter"))
console.log(swap("AbCdE"))
//或是這樣
function swap(str) {
// spilt() 把字串轉陣列
return str.split('').map(function(char) {
if (char>= 'A' && char <= 'Z'){
return char.toLowerCase()
} //這邊不寫 else 是因為不需要,因為只有兩個執行結果,如果不是大寫,就會跳到第二個return去
return char.toUpperCase()
}).join('') // join()把陣列變成字串
}
console.log(swap('!!!Peter'))
//三元運算子
function swap(str) {
return str.split('').map(function(char) {
return (char >= 'a' && char <= 'z')? char.toUpperCase(): char.toLowerCase()
}).join('')
console.log(swap('!!!Peter'))
請寫出一個函式 findMin,接收一個陣列並回傳陣列中的最小值。(禁止使用內建函式 sort)
findMin([1, 2, 5, 6, 99, 4, 5]) 預期回傳值:1 findMin([1, 6, 0, 33, 44, 88, -10]) 預期回傳值:-10
//解法一
function findMin(arr){
return Math.min.apply(null,arr)
//來源:https://www.jstips.co/en/javascript/calculate-the-max-min-value-from-an-array/
}
//老師的解法一 (看不太懂)
function isSmallest(arr, number){
return arr.filter(function(item) {
return item < number
}).length === 0
}// 判斷長度是否為零,如果是的話他就是 arr 內最小的數
function findMin (arr) {
for (var i=0; i<arr.length; i++) {
//這個數字數不是陣列裡面最小的?
if (isSmalleset(arr, arr[i])) {
return arr[i]
}
}
}
console.log(findMin([1, 2, 5, 6, 99, 4, 5]))
//老師解法二:先假設找到的最小值,把它存起來 (這比較簡單的解法)
function findMin(arr) {
var min = arr[0]
for (var i=0; i<arr.length; i++){
if (min > arr[i]) {
min = arr[i] //如果min不是最小值,改等於arr[i] 因為這比較小
}
}
return min
}
console.log(findMin([1, 2, 5, 6, 99, 4, 5]))
//方法一:利用內建函式 Math.min()
//注意:Math.min() and Math.max() 對數字陣列是無效的。
function findMin(arr){
//先設定一個值為基準
var result = arr[0]
//用古早方法跑迴圈,一個一個跑出答案
for (var i=1; i<arr.length; i++){
//用 Math.min 比較兩個值的大小
result = Math.min(result, arr[i])
}
return result
}
console.log(findMin([1, 2, 5, 6, 99, 4, 5]))
//方法二:利用產開運算子
function findMin(arr){
console.log(Math.min(...arr))
}
findMin([1, 6, 0, 33, 44, 88, -10])
//方法三:內建 sort函式
function findMin(arr){
arr.sort(function(a,b) {
//找最小值(最大值則是b-a)
return a-b
})
console.log(arr[0])
}
findMin([1, 2, 5, 6, 99, 4, 5])
findMin([1, 6, 0, 33, 44, 88, -10])
/* 來源:
http://www.jstips.co/zh_tw/javascript/calculate-the-max-min-value-from-an-array/
https://alanli7991.github.io/2016/09/01/JavaScript%E6%B1%82%E6%9C%80%E5%A4%A7%E5%80%BC%E5%92%8C%E6%9C%80%E5%B0%8F%E5%80%BC/
https://tw.saowen.com/a/7cc832974e4b5808477a0fffb45115bd25d45a60af84a1f6bda1916b327bd5d6
*/
這題是上一題的加強版,上一題只要你找出最小值,而這一題請你寫一個 function findNthMin,接收一個陣列以及一個數字 n,找出第 n 小的數字。(禁止使用內建函式 sort)
提示:假設我要找出第 2 小的值,我只要先找出最小的值然後再把它刪掉,再重新找一次最小的值,就會是第 2 小的值了。
findNthMin([1, 2, 3, 4, 5], 1) 預期回傳值:1 findNthMin([1, 3, 5, 7, 9], 3) 預期回傳值:5 findNthMin([1, 1, 1, 1, 1], 2) 預期回傳值:1
//先找到最小值
function findMin(arr){
var min = arr[0]
var minIndex = 0
for(var i=1; i<arr.length; i++){
if(min > arr[i]){
minIndex = i
}
}
return minIndex
}
//再找第 n 小的值
function findNthMin(arr, nth){
// nth-1 : 代表要刪幾次
for(var i=1; i<=nth-1; i++){
var minIndex = findMin(arr)
arr.splice(minIndex, 1) // 這裡的 1 代表刪去一個數值
}
var realMinIndex = findMin(arr)
return arr[realMinIndex]
}
console.log(findNthMin([1, 3, 5, 7, 9], 3))
console.log(findNthMin([1, 1, 1, 1, 1], 2))
請寫一個 function sort,接收一個陣列並且回傳由小到大排序後的陣列。(禁止使用內建函式 sort)
提示:如果你已經會找第 n 小的值了,試著把這個概念應用到這題上。 sort([ 6, 8, 3, 2]) 預期回傳值:[2, 3, 6, 8] sort([ 1, 2, 7 ,5]) 預期回傳值:[1, 2, 5, 7]
// 排序主要是在練習找出最小值。
function findMin(arr) {
let min = arr[0];
let minIndex = 0;
for (let i = 1; i < arr.length; i += 1) {
if (min > arr[i]) {
min = arr[i];
minIndex = i;
}
}
return minIndex;
}
function sort(arr) {
const ans = [];
// eslint-disable-next-line prefer-destructuring
const length = arr.length;
for (let i = 0; i < length; i += 1) {
const minIndex = findMin(arr);
ans.push(arr[minIndex]);
arr.splice(minIndex, 1);
}
return ans;
}
console.log(sort([6, 8, -11, 20, 3, 2]));
// arr.sort(),但這個用法適用 ASCII 字符順序,所以需要注意可能會有 [12,12,3,47,5] 的排法出現。
function sort(arr) {
let ans = arr.sort();
return ans;
}
2019/04/30 決定把心得寫出來,對自己滿失望的,已經是第二回重下鍋了,怎麼對於 js 的處理能力還是依然不夠?!越焦躁越想不出來,卡了一個早上最後還是耐不住求快的心看解答了~明知不可為還是忍不住。有一種挫敗感...
(遞迴題目) 請寫出一個 function flatten,接收一個多維陣列並回傳「壓平」後的陣列。
flatten([1, 2, 3]) 預期回傳值:[1, 2, 3] flatten([1, 2, [1, 2], [1, 3], 6]) 預期回傳值:[1, 2, 1, 2, 1, 3, 6] flatten([1, [2, [3, [4]], 5], 6]) 預期回傳值:[1, 2, 3, 4, 5, 6]
// 自己的解法,跟遞迴一點關係也沒有的感覺 (?)
function flatten(arr){
//先讓陣列變成字串
let str = arr.join()
let ans = []
for(var i=0; i<str.length; i++){
//如果字串內的字不是逗號
if(str[i] !== ",") {
//讓他變成數字後推進 ans[] 內
ans.push(Number(str[i]))
}
}
return ans
}
console.log(flatten([1, 2, 3]))
console.log(flatten([1, 2, [1, 2], [1, 3], 6]))
console.log(flatten([1, [2, [3, [4]], 5], 6]))
//老師的解法
function flatten(arr){
var result = []
for (var i=0; i<arr.length; i++){
//Array.isArray 判斷是不是個 array
if (Array.isArray(arr[i])){
var flatArr = flatten(arr[i]) //=> 壓平多層陣列
flatArr.forEach(function(value){
result.push(value)
})
} else {
result.push(arr[i])
}
}
return result
}
請寫一個 function tree,接收一個數字 n,按照規律列印出大小為 n 的聖誕樹
(這邊編輯器有點問題空白顯示不出來,用 _ 代表空白)
tree(1) 預期輸出:
*
tree(2) 預期輸出:
_*
***
_*
_*
tree(5) 預期輸出:
____*
___***
__*****
_*******
*********
____*
____*
____*
____*
____*
//老師解法
function tree(n){
if (n===1) return console.log('*')
//分成兩部分設
treeTop(n)
treeBottom(n)
}
function treeTop(n){
for(var i=1; i<=n; i++){
//空白是 *n-i , '*'為 2*i-1
console.log(' '.repeat(n-i) + '*'.repeat(2*i-1))
}
}
function treeBottom(n){
for(var i=1; i<=n; i++){
console.log(' '.repeat(n-1) + '*')
}
}
tree(3)
請寫出一個 function winner,接收一個代表圈圈叉叉的陣列,並回傳贏的是 O 還是 X,如果平手或還沒下完,請回傳 draw。
winner([
['O', 'O', 'X'],
['O', 'X', 'X'],
['O', 'X', 'O']
]) 預期回傳值:O
winner([
['O', 'O', 'X'],
['O', 'X', 'X'],
['X', 'X', 'O']
]) 預期回傳值:X
winner([
['O', 'O', 'X'],
['O', 'O', 'X'],
['X', 'X', '']
]) 預期回傳值:draw
function winner(arr) {
// 橫排
for (let i = 0; i < 3; i += 1) {
if (arr[i][0] === arr[i][1] && arr[i][1] === arr[i][2]){
return arr[i][0];
}
}
// 直排
for (let i = 0; i < 3; i += 1) {
if (arr[0][i] === arr[1][i] && arr[1][i] === arr[2][i]){
return arr[0][i];
}
}
// 左斜線
if (arr[0][0] === arr[1][1] && arr[1][1] === arr[2][2]){
return arr[0][0];
}
// 右斜線
if (arr[2][2] === arr[1][1] && arr[1][1] === arr[0][0]){
return arr[0][0];
}
return 'draw'
}
console.log(
winner([
['O', 'O', 'X'],
['O', 'X', 'X'],
['X', 'X', 'O']
])
)
console.log(
winner([
['O', 'O', 'X'],
['O', 'X', 'X'],
['O', 'X', 'O']
])
)
請寫出一個 function isPrime,給定一個數字 n,回傳 n 是否為質數。 (質數的定義:除了 1 以外,沒辦法被所有 < n 的正整數整除)
isPrime(1) 正確回傳值:false isPrime(5) 正確回傳值:true isPrime(37) 正確回傳值:true
function isPrime(n) {
if(n === 1) return false
for(var i=2; i<n; i++){
if ( n % 1 === 0 && n % i === 0){
return false
}
}
return true
}
console.log(isPrime(1))
console.log(isPrime(8))
console.log(isPrime(5))
console.log(isPrime(35)) //原本寫法會顯示為質數是錯誤的。
console.log(isPrime(37))
練習題 Lv1-4 + 隨堂考!
緣起於 Lv1-4 的答案雖然寫出來了,但不太理解為什麼顯示出來的答案不是:
題目+ 解答如下:
我想的執行過程:
後來老師說:
就這樣子結案!老樣子,馬的!應該早一點問的!自己查了老半天,還不如一問,又快又有效!
然後隨後來之是出乎意料的是隨堂考 TT~滿有趣的,所以決定也寫筆記下來~
題目如下:
function test(){ for(var i=1; i<=10; i++) { return i } }
console.log(test())
test() 進去 function
跑 for loop => i=1, i<=10, true => return i => i=1
流程解答二:
console.log(test())
test() 帶入 function => run for loop => i=1, i<=10 true => if 1%3, 不 === 0 => i=2, i<=10 true => if 2%3, 不 === 0 => i=3, i<=10 true => if 3%3, === 0 => return i, i=3
流程解答四: