zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    思考:缓存的使用?灵活运用?
    线程和并发--基础
    java基础--方法
    java基础--数组
    数据结构复习笔记
    asp搭建网站
    转换磁盘格式
    cypress 与其他测试框架的区别
    cypress启动时报错file already exists,文件已经存在解决办法
    cypress的安装
  • 原文地址:https://www.cnblogs.com/xiaxj/p/7784144.html
Copyright © 2011-2022 走看看