package WangYi; import java.util.HashSet; import java.util.Scanner; /*给定 n,再给了一个排列 T,扩充成排列 S(数字 1 - n 各使用一次)。问最小字典序的S * 一个T序列,长度为m,扩充为S序列,T为S的子序列,求最小字典序的S【长度为n】 * 2 1 5===2 1 3 4 5 * 1 对S序列扩充,得到2 1 5 3 4【填充的时候从1-n开始遍历,将不存在T的数字填充在S序列的后面,填充部分的数据肯定是小于n的,假如T为6 7 8则填充数据为1 2 * 2 p1指向0,p1指向m,设置一个辅助数组,将3 4插入前面的合适位置 */ public class Two { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); int T[] = new int[m]; HashSet<Integer> set = new HashSet<Integer>(); int index = 0; int res[] = new int[n]; for(int i = 0;i<m;i++) { T[i] = in.nextInt(); res[index++] =T[i]; if(!set.contains(T[i])) { set.add(T[i]); } } for(int i = 1;i<=n;i++) { if(set.size()==n) break; if(!set.contains(i)) { set.add(i); res[index++] =i; } } // for (int i = 0; i < res.length; i++) { // System.out.println(res[i]); // } int p1 = 0; int p2 = m; int res1[] = new int[n]; int p = 0; while(p1<m&&p2<n) { if(res[p1]<=res[p2]) { res1[p++] = res[p1++]; }else { res1[p++] = res[p2++]; } } while(p1<m) res1[p++] = res[p1++]; while(p2<n) res1[p++] = res[p2++]; for (int i = 0; i < res1.length; i++) { System.out.println(res1[i]); } } }
全部评论
(0) 回帖