题解 | #字符串合并处理#
字符串合并处理
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));
}
}

