题解 | #字符串合并处理#
字符串合并处理
http://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
1.字符串合并,直接+; 2.将字符串拆成两个字符串并分别排序; 3.分成四类情况考虑,数字,小写字母a-f,大写字母A-F,其余情况。当数字时,反转其四位二进制码,用stringbuilder的reverse。并输出成字符。字母先转化成数字再反转二进制码。这三步可以合并。如果不是这三类则直接对当前字符不做处理。
import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextLine()) { // 注意 while 处理多个 case String[] ss = in.nextLine().split(" "); String s =ss[0]+ss[1]; s=sort(s); s=code(s); System.out.println(s); } } public static String sort(String s){ List even=new ArrayList<>(); List odd=new ArrayList<>(); for(int i=0;i<s.length();i++){ if(i%2==0)even.add(s.charAt(i)); else odd.add(s.charAt(i)); } Collections.sort(even); Collections.sort(odd); String res=""; for(int i=0;i<s.length();i++){ if(i%2==0)res=res+even.get(i/2); else res=res+odd.get(i/2); } return res; } public static String code(String s){ String res=""; char ch; int digit; for(int i=0;i<s.length();i++){ if(Character.isDigit(s.charAt(i))){ digit=Integer.parseInt(s.charAt(i)+""); } else if(s.charAt(i)>='A'&&s.charAt(i)<='F'){ digit=s.charAt(i)-'A'+10; } else if(s.charAt(i)>='a'&&s.charAt(i)<='f'){ digit=s.charAt(i)-'a'+10; } else {res=res+s.charAt(i); continue;} String buf=Integer.toBinaryString(digit); while(buf.length()<4){ buf="0"+buf; } String buf2=new StringBuilder(buf).reverse().toString(); int num=Integer.parseInt(buf2,2); if(num>=10){ ch=(char)(num-10+'A'); } else ch=(char)(num+'0'); res=res+ch; continue; } return res; } }