字符串合并处理

https://www.nowcoder.com/practice/d3d8e23870584782b3dd48f26cb39c8f?tpId=37&tqId=21253&tPage=2&rp=&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking

 

目录

一、题目描述

二、代码实现

1、使用查表法实现十六进制字符的逆转

2、不使用额外存储空间实现十六进制字符的逆转

3、采用希尔排序实现排序算法


 

一、题目描述

按照指定规则对输入的字符串进行处理。

详细描述

将输入的两个字符串合并。

对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。

对排序后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’; 如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。

举例:输入str1为"dec",str2为"fab",合并为“decfab”,分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”

 

二、代码实现

1、使用查表法实现十六进制字符的逆转

使用Map存储映射关系

import java.util.Scanner;
import java.util.HashMap;
import java.util.Arrays;
public class Main {
    public static HashMap<Character,Character> map = null;
    public static void main(String[] args) {
        map = new HashMap<Character,Character>(){
  {
            put('0', '0');
            put('1', '8');
            put('2', '4');
            put('3', 'C');
            put('4', '2');
            put('5', 'A');
            put('6', '6');
            put('7', 'E');
            put('8', '1');
            put('9', '9');
            put('a', '5');
            put('b', 'D');
            put('c', '3');
            put('d', 'B');
            put('e', '7');
            put('f', 'F');
            put('A', '5');
            put('B', 'D');
            put('C', '3');
            put('D', 'B');
            put('E', '7');
            put('F', 'F');
        }};
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            String str1 = sc.next();
            String str2 = sc.next();
            String str = str1 + str2;
            String result = processString(str);
            System.out.println(result);
        }
    }
    
    public static String processString(String str) {
        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        for (int i=0; i<str.length(); i++) {
            if ((i & 1) == 0) {
                sb1.append(str.charAt(i));
            } else {
                sb2.append(str.charAt(i));
            }
        }
        
        String str1 = sort(sb1.toString());
        String str2 = sort(sb2.toString());
        
        StringBuilder sb3 = new StringBuilder();
        int i = 0, j = 0;
        while (j < str2.length()) {
            char ch1 = str1.charAt(i);
            char ch2 = str2.charAt(j);
            
            if ((ch1>='0' && ch1<='9') || (ch1>='A' && ch1<='F') || (ch1>='a' && ch1<='f')) {
                sb3.append(map.get(ch1));
            } else {
                sb3.append(ch1);
            }
            if ((ch2>='0' && ch2<='9') || (ch2>='A' && ch2<='F') || (ch2>='a' && ch2<='f')) {
                sb3.append(map.get(ch2));
            } else {
                sb3.append(ch2);
            }
            
            //
            //sb3.append(map.getOrDefault(ch1));
            //sb3.append(map.getOrDefault(ch2));
            //error: no suitable method found for getOrDefault(char)
            //
            //sb3.append(map.getOrDefault(Character.valueOf(ch1)));
            //sb3.append(map.getOrDefault(Character.valueOf(ch2)));
            //
            //sb3.append(map.getOrDefault((Character)ch1));
            //sb3.append(map.getOrDefault((Character)ch2));
            //
         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值