笔试强训 Day 21:爱丽丝的人偶、集合、最长回文子序列 爱丽丝的人偶解题思路贪心加构造两个一组依次反转代码实现importjava.util.*;importjava.io.*;publicclassMain{privatestaticPrintWriteroutnewPrintWriter(newBufferedWriter(newOutputStreamWriter(System.out)));publicstaticvoidmain(String[]args)throwsIOException{ScannerscnewScanner(System.in);intnsc.nextInt();for(inti1;in;i2){if(i1n)out.print(i1 );out.print(i );}out.close();}}集合方法一枚举解题思路输入的两个数组排序同时对各个情况进行判断维护上一个打印的数字避免打印重复数字importjava.util.*;importjava.io.*;publicclassMain{privatestaticPrintWriteroutnewPrintWriter(newBufferedWriter(newOutputStreamWriter(System.out)));privatestaticReadinnewRead();publicstaticvoidmain(String[]args)throwsIOException{intmin.nextInt(),nin.nextInt();int[]anewint[m];int[]bnewint[n];for(inti0;im;i)a[i]in.nextInt();for(inti0;in;i)b[i]in.nextInt();Arrays.sort(a);Arrays.sort(b);intpre0,idx10,idx20;while(idx1m||idx2n){if(idx1m){oPrint(b[idx2],pre);idx2;}elseif(idx2n){oPrint(a[idx1],pre);idx1;}elseif(a[idx1]b[idx2]){oPrint(a[idx1],pre);idx1;}elseif(a[idx1]b[idx2]){oPrint(b[idx2],pre);idx2;}elseif(a[idx1]b[idx2]){oPrint(a[idx1],pre);idx1;idx2;}}out.close();}privatestaticvoidoPrint(intnum,intpre){if(num!pre)out.print(num );prenum;}}classRead{StringTokenizerstnewStringTokenizer();BufferedReaderbfnewBufferedReader(newInputStreamReader(System.in));Stringnext()throwsIOException{if(!st.hasMoreTokens()){Stringlinebf.readLine();if(linenull)returnnull;stnewStringTokenizer(line);}returnst.nextToken();}intnextInt()throwsIOException{returnInteger.parseInt(next());}}方法二TreeSet 自动去重排序解题思路使用TreeSetInteger存储两个数组中的所有数字。TreeSet有两个特点自动去重自动按升序排序所以只需要把两组数据全部加入set最后遍历输出即可。时间复杂度约为O((n m) log(n m))代码实现importjava.util.*;// 注意类名必须为 Main不要有任何 package xxx 信息publicclassMain{publicstaticvoidmain(String[]args){ScannerinnewScanner(System.in);intnin.nextInt(),min.nextInt();TreeSetIntegersetnewTreeSet();intx;while(n--!0){xin.nextInt();set.add(x);}while(m--!0){xin.nextInt();set.add(x);}for(inta:set){System.out.print(a );}}}最长回文子序列解题思路动态规划dp[i][j]从 i~j 中, 回文子序列的最大长度分别枚举str[i]和str[j]是否相同时的情况相同需要根据下标分三种情况处理不相同时注意取最临近状态的最大值代码实现importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);char[]strsc.next().toCharArray();intnstr.length;int[][]dpnewint[n1][n1];// dp[i][j] 从 i~j 中, 回文子序列的最大长度// dp[i][j] dp[i1][j-1] 2for(intin;i0;i--){for(intj1;jn;j){if(ij)continue;if(str[i-1]str[j-1]){if(ij)dp[i][j]1;elseif(i1j)dp[i][j]2;elsedp[i][j]dp[i1][j-1]2;}else{dp[i][j]Math.max(dp[i1][j],dp[i][j-1]);}}}System.out.println(dp[1][n]);}}