PAT——1005. 继续(3n+1)猜想

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 }
原文地址:https://www.cnblogs.com/xiaxj/p/7784144.html