字符串合并

2023-11-12

题目描述

详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标意思是字符在字符串中的位置。
对排序后的字符串进行操作,如果字符为‘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”
接口设计及说明:
/*
功能:字符串处理
输入:两个字符串,需要异常处理
输出:合并处理后的字符串,具体要求参考文档
返回:无
*/
void ProcessString(char* str1,char *str2,char * strOutput)
{
}


输入描述:
输入两个字符串
输出描述:
输出转化后的结果
示例1
输入
dec fab
输出
5D37BF

思路

常规想法就是创建2个数组,把索引为奇数的放到一起,索引偶数放到的一起,然后对这两数组分别排序,再合并起来。
然后对合并后的字符串的每一个字符求二进制位,并求出倒序的值,再转换成对应的十六进制。

代码

方法一

第一次优化,我们采用步长为2的排序来直接对字符串排序,无须创建辅助的2个数组。所以我们可以采用步长为2的冒泡,插入,选择等等。但是这样就必须对字符串进行2次排序,第一次排序的初始值为0,第二次排序的初始值为1。还能优化吗,当然可以,希尔排序!直接进行一次步长为2的希尔排序就可以解决问题。

package com.special.improve;

import java.util.Scanner;

/** 
*
* @author special
* @date 2017年9月27日 下午6:16:46
*/
public class Pro29Improve1 {

    /**
     * 数组元素交换
     * @param ch
     * @param i
     * @param j
     */
    private static void swap(char[] ch, int i, int j){
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
    }
    /**
     * 希尔排序,其实就是步长为2的插入排序
     * @param ch
     * @param step
     */
    private static void shell(char[] ch, int step){
        int length = ch.length;
        /**
         * 注意i的初始值,i的增长
         * 注意j的初始值,为什么j取i,而不是i + 1呢?
         * 1.因为i的判断条件确保了他不会越界,所以我们j取i值一定不会越界
         * 2.如果我们j取i+1,我们就会错过i的正确排序!
         * 同时注意j的判断条件和步长
         * j>=step 是为了防止数组下界越界!
         */
        for(int i = step; i < length; i++){
            for(int j = i; j >= step; j -= step){
                if(ch[j] < ch[j - step]) swap(ch,j,j - step);
            }
        }
    }
    /**
     * 插入排序的另一个版本,可以减少交换的次数
     * 但要注意i,j的取值,同时注意内循环比较的条件!
     * @param ch
     * @param step
     */
    private static void improveShell(char[] ch, int step){
        int length = ch.length;
        for(int i = step; i < length; i++){
            char temp = ch[i];
            int j = i - step;
            for(; j >= 0; j -= step){
                if(ch[j] > temp) ch[j + step] = ch[j];
                else                     break;
            }
            ch[j + step] = temp;
        }
    }
    /**
     * 对单个字符进行处理
     * @param ch
     * @return
     */
    private static char solve(char ch){
        StringBuilder binary = new StringBuilder();
        int result = 0;
        if(ch >= '0' && ch <= '9')
            result = ch - '0';
        else if(ch >= 'A' && ch <= 'F')
            result = ch - 'A' + 10;
        else if(ch >= 'a' && ch<= 'f')
            result = ch - 'a' + 10;
        else
            return ch;
        while(result != 0){
            int temp = result & 1;
            binary.append(temp);
            result >>= 1;
        }
        binary.append("0000");
        String binaryStr = binary.substring(0, 4);
        int ans = 0;
        for(int i = 0; i < 4; i++)
            ans = ans * 2 + (binaryStr.charAt(i) - '0');
        if(ans >= 10)
            ch = (char) ('A' + (ans - 10));
        else
            ch = (char) ('0' + (ans - 0));
        return ch;
    }
    public static String ProcessString(String str1,String str2){
        String mergeString = str1 + str2;
        int length = mergeString.length();
        char[] mergeArr    = mergeString.toCharArray();
        improveShell(mergeArr,2);
        System.out.println(mergeArr);
        for(int i = 0; i < length; i++){
            mergeArr[i] = solve(mergeArr[i]);
        }
        return new String(mergeArr);
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            String str1 = input.next();
            String str2 = input.next();
            String result = ProcessString(str1,str2);
            System.out.println(result);
        }

    }

}

方法二

继续优化!既然考察的字符这么少,为何不打表,利用映射呢!也就是我们暴力枚举出所有的情况,利用2个平行的数组来模拟字符表,这样先在第一个数组中找到相应的索引,然后在第二数组中利用以上得出的索引找到变换的值。

package com.special.improve;

import java.util.Scanner;

/** 
* 利用映射表啊!!字符转换首先应该想到的
* 同时利用希尔排序
* @author special
* @date 2017年9月27日 下午6:58:41
*/
public class Pro29Improve2 {

    private static final String charTable    = "0123456789ABCDEFabcdef";
    private static final String mapCharTable = "084C2A6E195D3B7F5D3B7F";
    /**
     * 数组元素交换
     * @param ch
     * @param i
     * @param j
     */
    private static void swap(char[] ch, int i, int j){
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
    }
    /**
     * 希尔排序,其实就是步长为2的插入排序
     * @param ch
     * @param step
     */
    private static void shell(char[] ch, int step){
        int length = ch.length;
        /**
         * 注意i的初始值,i的增长
         * 注意j的初始值,为什么j取i,而不是i + 1呢?
         * 1.因为i的判断条件确保了他不会越界,所以我们j取i值一定不会越界
         * 2.如果我们j取i+1,我们就会错过i的正确排序!
         * 同时注意j的判断条件和步长
         * j>=step 是为了防止数组下界越界!
         */
        for(int i = step; i < length; i++){
            for(int j = i; j >= step; j -= step){
                if(ch[j] < ch[j - step]) swap(ch,j,j - step);
            }
        }
    }
    /**
     * 插入排序的另一个版本,可以减少交换的次数
     * 但要注意i,j的取值,同时注意内循环比较的条件!
     * @param ch
     * @param step
     */
    private static void improveShell(char[] ch, int step){
        int length = ch.length;
        for(int i = step; i < length; i++){
            char temp = ch[i];
            int j = i - step;
            for(; j >= 0; j -= step){
                if(ch[j] > temp) ch[j + step] = ch[j];
                else                     break;
            }
            ch[j + step] = temp;
        }
    }
    public static String ProcessString(String str1,String str2){
        String mergeString = str1 + str2;
        int length = mergeString.length();
        char[] mergeArr = mergeString.toCharArray();
        shell(mergeArr,2);
        /**
         * 字符转换常用的方法,利用映射表
         */
        for(int i = 0; i < length; i++){
            int index = charTable.indexOf(mergeArr[i]);
            if(index != -1)
                mergeArr[i] = mapCharTable.charAt(index);
        }
        return new String(mergeArr);
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            String str1 = input.next();
            String str2 = input.next();
            String result = ProcessString(str1,str2);
            System.out.println(result);
        }

    }


}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字符串合并 的相关文章

  • 以太坊合并升级的全面介绍

    以太坊主网即将通过称为 合并 的升级 从工作量证明转向权益证明共识机制 合并 Merge 是以太坊生态系统一系列主要升级的一部分 此外还有Surge Verge Purge以及Splurge 多次升级的目的是为了提高以太坊的可扩展性和能效
  • 两个单链表的合并(C语言实现)

    单链表的合并还是挺简单的 直接上代码吧 include
  • LeetCode——021

    21 Merge Two Sorted Lists My Submissions QuestionEditorial Solution Total Accepted 122136 Total Submissions 345783 Diffi
  • ECharts合并地图上的区域

    对于某些特定需求 官方下载的地图数据可能并不能完全满足 例如 要求显示中国地图 但需要将山东江苏和浙江这3个省合并起来 显示 东部区域 其他省份不变 于是就需要对官方提供的地图数据进行修改 一个思路是借助第三方工具 生成新区域的轮廓点 然后
  • 【Pandas 入门-2】增加,删除与合并数据 concat, merge

    文章目录 1 3 增加 删除与合并数据 1 3 1 增加数据 1 3 2 删除数据 1 3 3 合并数据 1 3 增加 删除与合并数据 1 3 1 增加数据 在原数据末尾增加一列时 语法为 df 新列名 某个值或某个元素个数与 DataFr
  • GridControl 列合并(自定义分组条件)

    说明 当前方式不提倡 最好还是使用 1 主从表 或 2 分组 一 数据源 DataTable dta new DataTable dta Columns Add A dta Columns Add B dta Columns Add C d
  • 快速解决Android编译报错 : Manifest merger failed with multiple errors, see logs

    编译项目的时候 遇到Android Manifest合并失败的情况就挺头疼的 Manifest merger failed with multiple errors see logs 直接运行项目 看不出来问题 以前都是通过 gradlew
  • ffmpeg合并两路rtmp流并推送

    ffmpeg实现两路流的覆盖 实现两路流的覆盖可以使用ffmpeg的overlay参数 将一路流覆盖到另外一路流之上 overlay参数简介 overlay x y 这里x和y表示距离左上角的坐标偏移 例子 ffmpeg i rtmp ip
  • git - 简明指南

    git 简明指南 助你入门 git 的简明指南 木有高深内容 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹 打开 然后执行 git init 以创建新的 git 仓
  • Java使用POI操作Excel合并单元格

    合并单元格的方法 指定 4 个参数 起始行 结束行 起始列 结束列 然后这个区域将被合并 CellRangeAddress region new CellRangeAddress startRow endRow startCol endCo
  • 使用ffmpeg合并多个视频文件

    由于腾讯视频将一个视频分割成多个20M左右的小文件 所以必须合并起来成为一个完整视频文件 用什么工具来合并这些文件呢 想到了已经安装好的ffmpeg 开源免费 又是现成的 两种方法 方法1 直接写文件名 使用 来分割 ffmpeg i co
  • Pandas-连接合并函数merge()

    一 merge函数用途 pandas中的merge 函数类似于SQL中join的用法 可以将不同数据集依照某些字段 属性 进行合并操作 得到一个新的数据集 二 merge 函数的具体参数 用法 DataFrame1 merge DataFr
  • error: You have not concluded your merge (MERGE_HEAD exists).git拉取失败

    拉取git上的更新时出现错误如下 error You have not concluded your merge MERGE HEAD exists hint Please commit your changes before mergin
  • 合并两个有序单链表(Java)

    思想 准备两个链表l1和l2 判断是否有链表为空 如果l1为空 则不用比较直接返回l2 如果l1为空 则直接返回l2 比较l1和l2节点 选出最小的那个节点 将该节点设为合并后的链表的head 头 节点 同时将指向该节点的l1或l2后移 方
  • 源代码主干分支开发四大模式

    作者 张克强 作者微博 张克强 敏捷307 1 先锋主干多稳定分支 2 守护主干多先锋分支 3 主干无分支 4 守护主干单分支 一 先锋主干多稳定分支 得到一个稳定版本后 将此稳定版本放到一个新分支上 针对此稳定版本的修修补补就在这个分支上
  • 将2个链表交替合并成一个链表

    将带有头结点的2个线性单链表交替有规则的合并成为一个链表 今天做这个的时候 又犯了以前一个愚蠢的错误 对于有些代码 为了方便我就直接复制了 编译器查出来有错 我一直看不出来错误在哪里 那一块我直接就忽略了 代码不敢随便复制 我画个图我认为直
  • 单链表中求中间节点

    问题描述 求单链表中间节点的值 如果中间有2个 只要第一个 就是偶数情况下 只要中间的第一个 速度要快 解决方法 可以参照这篇博文 http blog csdn net dawn after dark article details 736
  • 左式堆的合并

    二叉堆对于合并操作是困难的 因为需要把一个数组拷贝到另一个数组 左式堆可以高效的地支持合并操作 左式堆与二叉树之间唯一区别是 左式堆不是平衡的 可能非常趋向不平衡 左式堆的结构 typedef struct TreeNode element
  • 单链表中求倒数第几个节点

    问题描述 在单链表中求出倒数第K个节点 要求快速 方法一 利用链表的长度 不推荐 此方法必须事先知道链表的长度 在有长度的信息链表中 此方法可行 比如我之前的链表是这样的实现 参考博文 http blog csdn net dawn aft
  • 两个无序单链合并成一个有序单链表

    解题思路 两个无序链表先转换成两个有序单链表 两个有序单链表合并成一个有序单链表 代码 import java util 链表 class Node int val Node next public Node int val this va

随机推荐

  • 大数据平台搭建

    一 安装前准备 1 查看防火墙状态 2 关闭防火墙 分别在三台虚拟机上操作 root slave2 systemctl status firewalld service firewalld service firewalld dynamic
  • 全国大学生电子设计大赛赛前必备PID控制平衡车代码-pid实例

    全国大学生电子设计大赛平衡车完整代码arduino PID控制实例 This code is used for connecting arduino to serial mpu6050 module and test in arduino
  • 大话Stable-Diffusion-Webui-客制化主题(四)

    文章目录 目标 效果 开始 重要说明 单选框以及复选框图标样式更改 gradio主题构建器上传主题方式 代码上传主题方式 目标 在DIY的主题中更改gradio单选框组件以及复选框组件的勾选后图标样式 效果 开始 笔者在使用gradio的主
  • CORS跨域请求及实现机制

    一 什么是CORS CORS是一个W3C标准 全称是 跨域资源共享 Cross origin resource sharing 它允许浏览器向跨源服务器 发出XMLHttpRequest请求 从而克服了AJAX只能同源使用的限制 只要服务器
  • 设计模式--工厂模式

    总的说来 工厂模式有两种 工厂方法和抽象工厂 工厂方法模式定义了一个创建对象的接口 但由子类决定要实例化的类是哪一个 工厂方法让类把实例化方法推迟到子类 利用工厂方法创建对象 通常需要继承一个类 并覆盖它的工厂方法 举例如下 还是来自 He
  • BES SDK环境搭建与固件烧录

    搭建编译环境 安装虚拟机后需要安装编译工具链 有些SDK需要较高的GCC版本 自动安装 ubuntu16 04和ubuntu18 04都可以自动安装 只是默认版本号高低不同 Ubuntu18 04下为gcc version 6 3 1 20
  • visio导出高质量图片

    作者 久渝 链接 https www zhihu com question 39146184 answer 890602652 来源 知乎 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 在visio对象另存为图片的时候
  • [524]as_matrix将表格转换为矩阵

    coding utf 8 构建并测试CART决策树模型 import pandas as pd 导入数据分析库 from random import shuffle 导入随机函数shuffle 用来打乱数据 import matplotli
  • C/S模式和B/S模式区别及其优缺点

    1 C S模式 C S模式又称C S结构 是软件系统体系结构的一种 C S模式与B S模式相比 C S模式应用系统最大的优点是不依赖企业外网环境 即无论企业是否能够上网 都不影响使用 C S模式需要安装后才能使用 即以软件的形式存在 优点
  • Hadoop-分布式文件系统HDFS

    目录 HDFS简介 HDFS特点 HDFS相关概念 1 块 2 名称节点和数据节点 HDFS体系结构 1 HDFS体系结构概述 2 HDFS命名空间管理 3 通信协议 4 HDFS体系结构的局限性 HDFS常用的shell命令 HDFS简介
  • 用matlab写的径向分布函数RDF

    RDF是径向分布函数Radical distribution function的缩写 指的是给定一个空间 在此空间以一个对象为中心 去寻找周围对象的的概率 对于分子模拟的径向分布函数实则也是求解粒子在周期性边界盒子的区域密度和全局密度的比值
  • webpack无损压缩本地静态资源图片image-minimizer-webpack-plugin

    开发如果项目中引用了较多图片 那么图片体积会比较大 将来请求速度比较慢 我们可以对图片进行压缩 减少图片体积 一 image minimizer webpack plugin介绍 Image minimizer webpack plugin
  • STM32控制42步进电机

    首先采用TB6600驱动外接12VDC电源 STM32选c8t6最小系统板 接线TB6600跟32接线有共阴级接法 把ENA DIR PUL 与32共地 也有共阳接法 把ENA DIR PUL 与32共地 这里选共阴级接法 判断42步进电机
  • Python3面向对象编程

    1 类名用驼峰法 每个单词首字母大写 2 Python有构造函数 new 和初始化函数 init 3 绝对导入 需要指明模块 函数的完整路径 相对导入 4 每个模块的 name 属性 导入的时候赋值模块名字 直接执行的时候赋值 main 5
  • Java面向对象三大特点

    Java面向对象三大特点 一 封装性 封装一般是 把所有的属性私有化 对每个属性提供getter和setter方法 如果有一个带参的构造函数的话 那一定要写一个不带参的构造函数 数据被保护在抽象数据类型的内部 尽可能地隐藏内部的细节 只保留
  • matlab ofdm系统 过采样和欠采样,样本不均衡解决方法-过采样与欠采样

    在风控场景中 由于正样本获取的成本较高 往往样本比例是失衡的 样本的不平衡很容易导致模型偏向比例较高的一方 解决该问题的方法有很多 本文重要探讨基于 imbalanced learn 的采样方法 概述 imbalanced learn 是一
  • 菜鸟教程100题

    1 有四个数字 1 2 3 4 能组成多少个互不相同且无重复数字的三位数 各是多少 import itertools a 1 2 3 4 for i in range 1 5 for k in itertools permutations
  • [Python3网络爬虫开发实战] Scrapy 对接 Selenium

    Scrapy 对接 Selenium Scrapy 抓取页面的方式和 requests 库类似 都是直接模拟 HTTP 请求 而 Scrapy 也不能抓取 JavaScript 动态渲染的页面 在前文中抓取 JavaScript 渲染的页面
  • openEuler22.03通过yum安装postgresql及使用

    1 在系统上搜索有无postgresql的安装包 root localhost yum search postgresql Last metadata expiration check 0 47 44 ago on Wed 08 Feb 2
  • 字符串合并

    题目描述 详细描述 将输入的两个字符串合并 对合并后的字符串进行排序 要求为 下标为奇数的字符和下标为偶数的字符分别从小到大排序 这里的下标意思是字符在字符串中的位置 对排序后的字符串进行操作 如果字符为 0 9 或者 A F 或者 a f