題目地址:https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776java
卡拉茲(Callatz)猜測已經在1001中給出了描述。在這個題目裏,狀況稍微有些複雜。測試
當咱們驗證卡拉茲猜測的時候,爲了不重複計算,能夠記錄下遞推過程當中遇到的每個數。例如對 n=3 進行驗證的時候,咱們須要計算 三、五、八、四、二、1,則當咱們對 n=五、八、四、2 進行驗證的時候,就能夠直接斷定卡拉茲猜測的真僞,而不須要重複計算,由於這 4 個數已經在驗證3的時候遇到過了,咱們稱 五、八、四、2 是被 3「覆蓋」的數。咱們稱一個數列中的某個數 n 爲「關鍵數」,若是 n 不能被數列中的其餘數字所覆蓋。code
如今給定一系列待驗證的數字,咱們只須要驗證其中的幾個關鍵數,就能夠沒必要再重複驗證餘下的數字。你的任務就是找出這些關鍵數字,並按從大到小的順序輸出它們。rem
每一個測試輸入包含 1 個測試用例,第 1 行給出一個正整數 K (<100),第 2 行給出 K 個互不相同的待驗證的正整數 n (1<n≤100)的值,數字間用空格隔開。get
每一個測試用例的輸出佔一行,按從大到小的順序輸出關鍵數字。數字間用 1 個空格隔開,但一行中最後一個數字後沒有空格。input
6 3 5 6 7 8 11
7 6
在驗證猜測的時候,當計算到某個數字以後,後面的計算過程是相同的,找到這些覆蓋數,遍歷原有數據,若是覆蓋數中包含原有數據,則將該覆蓋數移除 ,剩下的即是關鍵數。it
import java.util.ArrayList; import java.util.Iterator; import java.util.Collections; import java.util.List; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; public class Main { // 一系列數中的覆蓋數 private static Set<Integer> coverNumberSet = new TreeSet<Integer>(); // 待驗證數據 private static List<Integer> array = new ArrayList<Integer>(); public static void main(String[] args) { // 輸入數據 Scanner scanner = new Scanner(System.in); int k = Integer.parseInt(scanner.nextLine()); String line = scanner.nextLine(); String[] inputArray = line.split(" "); for (int i = 0; i < inputArray.length; i++) { array.add(Integer.parseInt(inputArray[i])); } // 找到某一個數全部的覆蓋數 for (int i = 0; i < array.size(); i++) { findCoverNumber(array.get(i)); } // 對剩下的數與覆蓋數進行比較,剩下的數等於覆蓋數的則被覆蓋,從待驗證數據中刪除,最後剩下的數據即爲關鍵數 Iterator<Integer> it = array.iterator(); while (it.hasNext()) { Integer data = it.next(); if (coverNumberSet.contains(data)) { it.remove(); } } Collections.sort(array); for (int i = array.size() - 1; i >= 0; i--) { if (i != 0) { System.out.print(array.get(i) + " "); } else { System.out.print(array.get(i)); } } } public static void findCoverNumber(Integer number) { Integer coverNumber = new Integer(0); while (number != 1) { if (number % 2 == 0) { coverNumber = number / 2; } else { coverNumber = (number * 3 + 1) / 2; } coverNumberSet.add(coverNumber); number = coverNumber; } } }