/** 题目描述: * 我们希望一个序列中的元素是各不相同的,但是理想和现实往往是有差距的。现在给出一个序列A,其中难免有些相同的元素,现在提供了一种变化方式,使得经过若干次操作后一定可以得到一个元素各不相同的序列。 * 这个操作是这样的,令x为序列中最小的有重复的数字,你需要删除序列左数第一个x,并把第二个x替换为2*x。 * 请你输出最终的序列。 * 例如原序列是[2,2,1,1,1],一次变换后变为[2,2,2,1],两次变换后变为[4,2,1],变换结束 * * 输入描述 * 输入第一行包含一个正整数n,表示序列的长度为n。(1<=n<=50000) 第二行有n个整数,初始序列中的元素。(1<=a_i<=10^8) 输出描述 * 输出包含若干个整数,即最终变换之后的结果。 */
思路:先将数组元素放入list集合和优先队列,使用优先队列出栈最小值,
在list集合中查找该元素是否重复,如果重复,则对list集合进行修改删除操作(更新),
将更新后的数据存入新的优先队列中。继续进行第二轮出栈。
如果最小元素没有重复,则list集合不更新,优先队列也不更新。
如此重复,知道list集合中没有重复元素为止。
public static List<Integer> adjustArray(int[] nums) { //使用优先队列对数据进行调 List<Integer> list = new ArrayList<Integer>(); for (int m : nums) { list.add(m); } Iterator<Integer> iterator = list.iterator(); PriorityQueue<Integer> queue = new PriorityQueue<Integer>(); //入队列 while (iterator.hasNext()) { queue.offer(iterator.next()); } for (int n = 0; n < queue.size(); n++) { //取出最小值 int min = queue.poll(); //计算重复次数 int count = 0; //定位重复元素的索引 int fristIndex = 0; int secondIndex = 0; //验证最小值是否重复 for (int i = 0; i < list.size(); i++) { if (list.get(i) == min) { count++; //数据重复 if (count == 1){ fristIndex = i; } if (count == 2) { //定位第二个重复数据 secondIndex = i; break; } } } //如果有重复数据,删除第一个重复数据,修改第二个重复数据,并且更新队列 if (count == 2) { list.set(secondIndex, list.get(secondIndex) * 2); list.remove(fristIndex); //修改后,更新队列 PriorityQueue<Integer> queue2 = new PriorityQueue<Integer>(); for (int j = 0; j < list.size(); j++) { queue2.offer(list.get(j)); queue = queue2; } } //更新计数器 count = 0; //更新n n = 0; } return list; }