15. Jolly Jumpers (CPE10405, UVA10038) - CPE一顆星解答與說明
CPE一顆星49題解答 - pdf 電子檔,售價 99 元,
明年將調漲至 199 元!
購買電子檔可將筆記帶著走,
坐車、上課時皆可隨時複習,
不受網路或廣告影響,
若有需要可來信 greens2314@gmail.com
解答/答案/註解/程式碼/JAVA
解答最外層請自行 import 相關套件與新增 main class
public class main {
//解答
}
CPE一顆星49題解答 - pdf 電子檔,售價 199 元,
購買電子檔可將筆記與完整解答帶著走,
坐車、上課時皆可隨時複習,
不受網路或廣告影響,
若有需要請來信購買 greens2314@gmail.com
題目
- 判斷數列是否為 jolly jumper
- 兩兩數值相減取絕對值,差值為 1 ~ n - 1
- 數列:1 4 2 3,4 個數字,n = 4
- | 1 – 4 | = 3
- | 4 – 2 | = 2
- | 2 – 3 | = 1
- 差值:1, 2, 3,為 1 ~ 3 (4 - 1) 之間,故為 Jolly Jumpers
輸入說明
- 每一行包含數字 N ,表示接下來有 N 個數字
輸出說明
- 根據每行輸入,計算出是否為 Jolly Jumpers
解題技巧
- 了解 Set 集合介面的用法
- 不允許擺放相同的資料
- 元素具有唯一性的集合
- 符合題目的需求,可收集到具有唯一性的兩數差值
- 實做
- HashSet implements Set
- 無順序
- TreeSet implements Set
- 有順序
- 以下兩種宣告方法都可以
- Set<Integer> sets = new TreeSet<Integer>();
- TreeSet<Integer> sets = new TreeSet<Integer>();
- 兩數相減,取絕對值
- 呼叫 Math.abs()方法
解題過程
取得輸入
- 使用 while 偵測是否有數字輸入,使用 hasNextInt()
- 取得資料筆數,使用 nextInt()
- 使用根據資料筆數
- 宣告相同長度陣列來儲存測試數字
- 使用 for 迴圈讀取測試數字,並存入陣列中
使用 for 迴圈讀取測試數字的陣列,進行兩數相減
- 迴圈內要做的處理
- 目前的索引位置的數值 減掉 下 1 個索引位置的數值
- 取絕對值,呼叫 Math 類別提供的 abs() 方法
- 在 for 迴圈的條件式要小於資料筆數減 1 ,若條件式為小於資料筆數沒有減 1 的話,會遇到 ArrayIndexOutOfBoundsException
- 例如:資料筆數為 2,測試數字陣列長度為 2,索引分別為 0 與 1
當for (int i = 0; i < 2 ; i++) - 索引位置 0 的值 減 索引位置 1 的值
- 索引位置 1 的值 減 索引位置 2 的值 ,這邊讀取索引 2 時會引發 ArrayIndexOutOfBoundsException
- 要寫 for (int i = 0; i < 2 - 1; i++) 才是正確的
判斷計算結果是否介於 1 ~ 資料筆數 - 1 之間
- 若介於 1 ~ 資料筆數 - 1 才符合 Jolly Jumpers 的定義
- 宣告 TreeSet ,儲存兩數相減的結果
- TreeSet<Integer> sets = new TreeSet<Integer>();
- 將計算結果存入 TreeSet 集合中,呼叫 add() 方法
判斷 TreeSet 的大小是否等於資料筆數 - 1
- Jolly Jumpers 的定義
- 某一數列中兩兩數列相減的絕對值的數值會介於 1 ~ 資料筆數 - 1
- 例如 5 個數值,其兩兩相減的數值會有 4 (5-1)個:1, 2, 3, 4 (5-1)
- 例如 8 個數值,其兩兩相減的數值會有 7 (8-1)個:1, 2, 3, 4, 5, 6, 7 (8-1)
- 只須判斷 TreeSet 中的數值數量是否為資料筆數 - 1 可推得是否符合定義
- TreeSet 儲存的資料筆數,呼叫 size() 方法
留言
張貼留言