思路:
输入数时,验证猜想,把过程中的数都读入一个数组,当然如果数组中已经存在,就不必继续添加。当这些数都添加后,遍历输入的数组,把过程数中没有的数挑出来,也就是关键数。简单点说,把这些数字都进行一次验证,过程所产生的所有的数字就是被覆盖的数字。那没被覆盖的数字就是关键数字。
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();
}
}
}
其实代码就是那么写字母,学一阵子就差不多都掌握了,主要是思路,训练好思维很重要,比如说这道题让求关键数字,要知道关键数就是没被覆盖的数字。直接求没被覆盖的数字不好求又或者不能求的话,那就从另一面考虑,先求出被覆盖的数字,那么剩下的数字就是没被覆盖的数字。