题解 | #字符串合并处理#
字符串合并处理
https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String a; try { a = r.readLine(); } catch (IOException e) { throw new RuntimeException(e); } char[] chs0 = a.toCharArray(); char[] chs = new char[chs0.length - 1];//减去空格后的字符串长度 int i = 0, j = 0, l = chs0.length, num = 0, num1, k; char tmp; boolean b1, b2, b3; while (i < l) { if (chs0[i] == ' ') { i++; continue; } chs[j++] = chs0[i]; i++; } l = chs.length; if ((l & 1) == 1) {//长度是奇数 i = 0; do {//奇数位初次排序 if (chs[i] > chs[i + 2]) { tmp = chs[i]; chs[i] = chs[i + 2]; chs[i + 2] = tmp; } i += 2; } while (i < l - 1); l--;//最后一位已经为奇数位最大,长度减1 } i = 0; do {//剩下的偶数位,冒泡排序 j = 0; do { if (chs[j] > chs[j + 2]) { tmp = chs[j]; chs[j] = chs[j + 2]; chs[j + 2] = tmp; } if (chs[j + 1] > chs[j + 3]) { tmp = chs[j + 1]; chs[j + 1] = chs[j + 3]; chs[j + 3] = tmp; } j += 2; } while (j < l - 2 - i);//终止条件比较特殊 i += 2; } while (i < l - 2);//终止条件和常规冒泡类似,步长变为2 i = 0; l = chs.length; do { b1 = (chs[i] - 'a' | 'f' - chs[i]) > 0; b2 = (chs[i] - 'A' | 'F' - chs[i]) > 0; b3 = (chs[i] - '0' | '9' - chs[i]) > 0; if (b1 || b2 || b3) { if (b1) num = chs[i] - 'a' + 10;//a~f之间,转为十进制 if (b2) num = chs[i] - 'A' + 10;//A~F之间,转为十进制 if (b3) num = chs[i] - '0';//转为十进制 } else { i++; continue; } j = 0; num1 = 0; do { k = num % 2;//二进制下该位的01值 num = num >> 1;//最后一位右移 num1 *= 2;//逆序,最低位二进制下是最高位,随着循环进行,不断*2 num1 += k; j++; } while (j < 4); if (num1 > 9) num1 += 55;//十进制10对应A,字符A的整形数字是65,因此加55 else num1 += 48;//十进制0对应0,字符0的整形数字是48,因此加48 chs[i] = (char) num1;//强制转换位字符 i++; } while (i < l); System.out.print(new String(chs)); } }