题解 | #字符串合并处理#

字符串合并处理

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));
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务