java实现字符串合并处理

字符串合并处理

http://www.nowcoder.com/questionTerminal/d3d8e23870584782b3dd48f26cb39c8f

笨办法,先找出奇数偶数组,排序后再合起来,针对要求的字符做bit反转处理,最后结果拼起来。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String str = "";
        while ((str = reader.readLine()) != null) {
            str = String.join("", str.split(" ")); // 合并字符串
            str = handlerStr(str);
            System.out.println(solution(str));
        }

        reader.close();
    }

    public static String solution(String str){
        if (null == str || str.length() == 0) return str;
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            // 对16进制的字符处理
            if (String.valueOf(str.charAt(i)).matches("[0-9A-Fa-f]")){
                int dec = Integer.parseInt(String.valueOf(str.charAt(i)), 16);
                dec = reverseBit(dec);
                builder.append(Integer.toHexString(dec).toUpperCase());
                continue;
            }
            // 其他字符直接拼接
            builder.append(str.charAt(i));
        }

        return builder.toString();
    }

    /**
     * bit反转,分治法
     * @param n
     * @return
     */
    public static int reverseBit(int n){
        n = ((n & 0xc) >>> 2) | ((n & 0x3) << 2);
        n = ((n & 0xa) >>> 1) | ((n & 0x5) << 1);
        return n;
    }

    /**
     * 字符串奇偶排序
     * @param str
     * @return
     */
    public static String handlerStr(String str){
        if (null == str || str.length() == 0) return str;
        List<Character> even = new ArrayList<>();
        List<Character> odd = new ArrayList<>();
        // 找出偶数下标组和奇数下标组
        for (int i = 0; i < str.length(); i++) {
            if (i % 2 == 0) even.add(str.charAt(i));
            else odd.add(str.charAt(i));
        }
        // 排序
        even = even.stream().sorted(Character::compareTo).collect(Collectors.toList());
        odd = odd.stream().sorted(Character::compareTo).collect(Collectors.toList());
        // 排序后再按原下标位置合并起来
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < even.size(); i++) {
            builder.append(even.get(i));
            if (i < odd.size()) builder.append(odd.get(i));
        }
        return builder.toString();
    }
}
全部评论

相关推荐

头像
不愿透露姓名的神秘牛友
03-13 10:56
点赞 评论 收藏
转发
头像 头像
05-06 18:28
已编辑
Java
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务