Java - PAT - 1005. 继续(3n+1)猜想 (25)

题目地址:1005. 继续(3n+1)猜想 (25) 


思路:

输入数时,验证猜想,把过程中的数都读入一个数组,当然如果数组中已经存在,就不必继续添加。当这些数都添加后,遍历输入的数组,把过程数中没有的数挑出来,也就是关键数。简单点说,把这些数字都进行一次验证,过程所产生的所有的数字就是被覆盖的数字。那没被覆盖的数字就是关键数字。


import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;  
public class Main{  
	public static void main(String[] args){  
		Scanner sc = new Scanner(System.in);  
		int n = sc.nextInt();
		int[]a1 = new int[n];		//进行操作的数组
		int[]a2 = new int[n];
		ArrayList<Integer>alist1 = new ArrayList<Integer>();		//被覆盖数
		ArrayList<Integer>alist2 = new ArrayList<Integer>();		//关键数
    
		for(int i=0 ;i<n ;i++){
			a2[i] = sc.nextInt();
			a1[i] = a2[i];
      
			while(a1[i]!=1){				//将覆盖数添加到alist1中
				if(a1[i]%2==0){
					a1[i] /=2;
					if(!alist1.contains(a1[i])){
						alist1.add(a1[i]);
					}else{
						break;
					}
				}else{
					a1[i] = (3*a1[i]+1)/2;
					if(!alist1.contains(a1[i])){
						alist1.add(a1[i]);
					}else{
						break;
					}
				}
			}
		}
    
		for(int i=0 ;i<a2.length ;i++){			//遍历输入的数组 
			if(!alist1.contains(a2[i])){		//在覆盖数中没有的话
				alist2.add(a2[i]);				//添加到alist2 即关键数
			}
		}
  
		Collections.sort(alist2);
		if(alist2.size()==1){
			System.out.println(alist2.get(0));
		}else{
			for(int i=alist2.size()-1 ;i>=0 ;i--){
				System.out.print(alist2.get(i));
				if(i!=0){
					System.out.print(" ");
				}
			}
			System.out.println();
		}
	}
}

其实代码就是那么写字母,学一阵子就差不多都掌握了,主要是思路,训练好思维很重要,比如说这道题让求关键数字,要知道关键数就是没被覆盖的数字。直接求没被覆盖的数字不好求又或者不能求的话,那就从另一面考虑,先求出被覆盖的数字,那么剩下的数字就是没被覆盖的数字。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值