PAT乙級1005

1005 繼續(3n+1)猜測 (25分)

題目地址: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;
        }
    }
}
相關文章
相關標籤/搜索