描述
当n为3时,我们在验证xxx定律的过程中会得到一个序列,3,5,8,4,2,1,将3称为关键数,5,8,4,2称为覆盖数。现在输入n个数字a[i],根据关键数与覆盖数的理论,我们只需要验证其中部分数就可以确定所有数满足xxx定律,输出输入的n个数中的关键数。如果其中有多个关键数的话按照其输入顺序的逆序输出。
输入描述:
输入数据包含多个用例,每个用例首先包含一个整数n,然后接下来一行有n个整数a[i],其中: 1<=n<=500, 1<a[i]<=1000
输出描述:
请计算并输出数组a中包含的关键数,并按照其输入顺序的逆序输出,每个用例输出占一行。
示例1
输入:
3 3 8 4 5 3 8 4 7 15 5 3 8 4 15 7 0
复制输出:
3 15 7 3 7 15 3
代码如下:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
/*
* 继续xxx定律
*
* 注意:
* 1、HashSet和HashMap的区别:
* (1)HashSet是一个集合,它存储的是值的集合,而HashMap是一个键值对的映射表,它存储的是键值对的集合。
* (2)HashSet中的元素是无序的且不重复的,而HashMap中的键是无序且不重复的,值可以重复。
* (3)HashSet使用add()方法来添加元素,contains()方法来判断元素是否存在,remove()方法来移除元素;
* HashMap使用put()方法来添加键值对,get()方法来获取值,remove()方法来移除键值对。
* 2、
*/
public class ContinueXXXLaw {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
if (n == 0) {
break;
}
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
//将覆盖数保存在HashSet集合中(重复的数不会保存)
HashSet<Integer> coverSet = new HashSet<Integer>();
//用于存储数组中的关键字
ArrayList<Integer> al = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
int temp = arr[i];
//将arr[i]的覆盖数保存
while(temp != 1) {
if(temp % 2 == 0) {
temp = temp / 2;
}else{
temp = (temp * 3 + 1) / 2;
}
coverSet.add(temp);
}
}
//找出数组中所有不是覆盖数的数
for (int i = n-1; i >= 0; i--) {
if(!coverSet.contains(arr[i])) {
al.add(arr[i]);
}
}
for (Integer i : al) {
System.out.print(i + " ");
}
System.out.println();
}
}
}