pat原题目:https://www.patest.cn/contests/pat-b-practise/1005
原题目:
卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。
当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇到过了,我们称5、8、4、2是被3“覆盖”的数。我们称一个数列中的某个数n为“关键数”,如果n不能被数列中的其他数字所覆盖。
现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。
输入格式:每个测试输入包含1个测试用例,第1行给出一个正整数K(<100),第2行给出K个互不相同的待验证的正整数n(1<n<=100)的值,数字间用空格隔开。
输出格式:每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用1个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
6 3 5 6 7 8 11
输出样例:
7 6
------------------------------------------------------------------------------------------------------------------------------
这道题目重点在于题目的条件:为了避免重复计算,可以记录下递推过程中遇到的每一个数 ,在计算第一个数的时候将过程中遇到的数都保存到一个链表中,List<>.
同时新建一个keylist<>用于保存“关键数” ,每次遇到一个新数据的时候,先遍历list,检测里面是否包含该对象,如果包含,则不继续计算。否则开始按照猜想中的要求计算,并且将每一个过程数
都添加到list中,等所有的数据都检查完之后,在利用list.contain(int a),遍历原数组中的每一个数,如果不包含,则添加到中 keylist<> 去 。
主要核心知识点:
1:list<>
2:Collections.sort()
利用compare.to( T o)来进行比较,排序
1 package com.hone.basical; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Scanner; 7 8 public class basicalLevel10053nPlus1 { 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 int n = Integer.parseInt(input.nextLine()); 12 int[] numbers = new int[n]; 13 List<Integer> list = new ArrayList<>(); 14 List<Integer> keylist = new ArrayList<>(); 15 16 String numStr = input.nextLine(); 17 String[] numStrArr = numStr.split(" "); 18 for (int i = 0; i < n; i++) { 19 numbers[i] = Integer.parseInt(numStrArr[i]); 20 if(!list.contains(numbers[i])){ 21 while(numbers[i] > 1){ 22 if(numbers[i]%2 == 0){ 23 numbers[i] = numbers[i]/2; 24 list.add(numbers[i]); 25 } 26 else{ 27 numbers[i] = 3*numbers[i]+1; 28 numbers[i] = numbers[i]/2; 29 list.add(numbers[i]); 30 } 31 } 32 } 33 } 34 for (int i = 0; i < n; i++) { 35 if(!list.contains(Integer.parseInt(numStrArr[i]))){ 36 keylist.add(Integer.parseInt(numStrArr[i])); 37 } 38 } 39 40 //默认为升序排序 41 Collections.sort(list); 42 if(keylist.size() == 1){ 43 System.out.println(list.get(0)); 44 }else{ 45 for(int i=keylist.size()-1 ;i>=0 ;i--){ 46 System.out.print(keylist.get(i)); 47 if(i!=0){ 48 System.out.print(" "); 49 } 50 } 51 System.out.println(); 52 } 53 54 } 55 }