Java學習記錄21 — 代碼挑戰4

張小雄
8 min readJan 16, 2021

--

題目:Number Palindrome

創立名為的method,接收名為的參數,回傳。

創立名為isPalindrome的method,接收名為number的int參數,回傳boolean。

判別number是否為回文數(跟倒過來一樣 ex:123,12321,-1221)

測試數據:

System.out.println(isPalindrome(-111));
System.out.println(isPalindrome(110));
System.out.println(isPalindrome(101));
System.out.println(isPalindrome(25));
System.out.println(isPalindrome(11212));
System.out.println(isPalindrome(-1221));
System.out.println(isPalindrome(707));

結果:

true

false

true

false

false

true

true

題目:First And Last Digit Sum

創立名為sumFirstAndLastDigit的method,接收名為number的int參數,回傳int。

用loop找出number的第一位數跟最後一位數,相加後回傳。

P.S number為個位數的話也是相加,number = 3 → 3 + 3 要return 6。

若number為複數回傳-1。

測試數據:

System.out.println(sumFirstAndLastDigit(252));
System.out.println(sumFirstAndLastDigit(257));
System.out.println(sumFirstAndLastDigit(0));
System.out.println(sumFirstAndLastDigit(5));
System.out.println(sumFirstAndLastDigit(-10));

結果:

4

9

0

10

-1

題目:Even Digit Sum

創立名為getEvenDigitSum的method,接收名為number的int參數,回傳int。

把number裡面的每個偶數相加後回傳。

若number為複數回傳-1。

測試數據:

System.out.println(getEvenDigitSum(123456789));
System.out.println(getEvenDigitSum(252));
System.out.println(getEvenDigitSum(-22));

結果:

20

4

-1

題目:Shared Digit

創立名為hasSharedDigit的method,接收2個int參數,回傳boolean。

2個參數都需要在10–99(皆包含)的範圍內,否則返回false。

12,23 皆含2,且在範圍內,返回true

15,55 皆含5,且在範圍內,返回true

9,99 皆含9,但第一個數9不在10–99範圍內,返回false。

測試數據:

System.out.println(hasSharedDigit(12, 23));
System.out.println(hasSharedDigit(9, 99));
System.out.println(hasSharedDigit(15, 55));

結果:

true

false

true

題目:Last Digit Checker

創立名為hasSameLastDigit的method,接收3個int參數,回傳boolean。

三個參數皆須在範圍10–1000(皆包含),否則回傳false。

如果至少兩個參數的個位數是一樣的回傳ture,否則回傳false。

ex: 41, 22, 71 兩個 個位數為1 回傳true

創立名為isValid的method,接收int參數,回傳boolean。

判斷傳入的參數是否在範圍10–1000(皆包含)是回傳true,否則回傳false。

測試數據:

System.out.println(hasSameLastDigit(42, 22, 71));
System.out.println(hasSameLastDigit(23, 42, 42));
System.out.println(hasSameLastDigit(9, 99, 999));

結果:

true

true

false

題目:Greatest Common Divisor

創立名為getGreatestCommonDivisor的method,接收名為first跟second的int參數,回傳int。

如果其中一個 < 10,回傳 -1。

判斷最大公因數並回傳

測試數據:

System.out.println(getGreatestCommonDivisor(25, 15));
System.out.println(getGreatestCommonDivisor(12, 30));
System.out.println(getGreatestCommonDivisor(9, 18));
System.out.println(getGreatestCommonDivisor(81, 153));

結果:

5

6

-1

9

參考答案

Number Palindrome

回文數我卡了超久約2~3個小時

先是卡在第17行的邏輯,到底怎麼把數字倒過來塞到變數裡去

我那時候把reverse + digit 一起乘10,拿紙筆弄半天才發現哪裡錯了

還卡在如果有0的情況,好像還卡在設original_number之前

沒注意到直接丟number計算,把value也一起改變

最後 reverse == number的比對 怎樣都錯

本題邏輯講解

先取個位數 下一次循環 之前取的數字*10再加上這輪取的個位數 反覆循環

參數 123

第一輪

取個位數3

第二輪

剩12

取個位數2

前面取的3*10

2+30變成32

第三輪

剩1

取個位數1

前面取的32*10

1+320變成321

123 != 321

得到 false

完成

也不用怕遇到0

例如10

第一輪

取個位數0

第二輪

剩1

前面取的 0 * 10 = 0

1 + 0 = 1

10 != 1

得到 false

完成

First And Last Digit Sum

Even Digit Sum

Shared Digit

先是用簡單的方法寫了一遍

優化寫法

看起來很複雜其實很簡單

第一個while取個位數

與第二個while的每輪個位數比較

一樣就返回true

沒有一樣就進行第一個while的下一個位數

再與第二個while的每輪個位數比較

數字化就是

12 與 34

用2 跟4比 再跟3比

再用1 跟4比 再跟3比

比完都沒有就false

若中間有遇到一樣就true 然後 break退出循環

好處是不管今天題目改幾位數,這邏輯都能用

10位數 對 10位數

10位數 對 2位數

用這方法跑都能成功

Last Digit Checker

Greatest Common Divisor

一開始卡了一陣子,沒啥頭緒

所以先寫了兩段分開的for 各取得自己的最大因數

後來想到第一個因數 也要拿到second一個一個去比 設法找出最大公因數

想說是不是要搞個for 中 for

後來靈光一閃

不用那麼麻煩

用同時滿足來判斷就好

就寫了if((first % i == 0) && (second % i == 0))

滿足一次就更新數字

所以最後的數字一定就是最大公因數

整個簡單了許多

i 的中止條件設 i <= (first / 2)

不用循環到本身的數

減少循環次數

如果因數不包含2 那最大的因數不會超過 自身/2

如果有含2那最大因數就是 自身/2

第二種解法 同學分享的

真TM聰明!!!

用輾轉相除法就搞定了

大神阿~~

我都忘記有這東西了

本篇使用代碼

--

--

張小雄
張小雄

Written by 張小雄

記錄成為軟體工程師的過程

No responses yet