吃透一道题day2:Java算法中的“如何找到给定字符串中的不同字符“

写在开头:很久没有开启有关算法的内容了,在正式开启开启今天这段算法之旅之前,跟大家谈一谈上周五歌手也就是第二期我的一些直观感受:相比第一期(chante moore的if i aint got you和faouzia的crazy带给我的经验)没有任何特别的惊艳之处,很平淡甚至可以说是心如止水,这里就不过多评价了,如果有也对歌手或者对音乐感兴趣的朋友可以去某站看看JKAI杰凯视频里外国老师的评价十分专业与令人倾佩。

好了回归正题,请看VCR。

目录

一、审题(提取信息)

1.题目

2.灵感

二、初步实现(思路变代码)

1.ASCII码表

2.Math类

3.比特位

4.代码(通用版)

三、丰富思路(阅读参考他人题解)

1.秒杀示例

2.收获

四、完整代码


一、审题(提取信息)

1.题目

在不考虑字符排列的条件下,对于相差只有一个字符的两个字符串,实现一个算法来识别相差的那个字符。要求如下:

        1.当传入的字符串为 aad 和 ad 时,结果为 a

        2.当传入的字符串为 aaabccdd 和 abdcacade 时,结果为 e

看完我们可以得到什么信息?灵感?启发?假设你之前做过一道关于“确定字符串是否是另一个的排列”的题目,不难从那道题里汲取一些灵感。

手把手带你逐“帧”实现Java算法中的如何找到给定字符串中的不同字符。

2.灵感

最初有一些想法:假设输入的两个字符串分别为s1、s2,通过遍历将两个字符串中的每个字符分别取出,然后通过记录s1.charAt(i)-'a'和s2.charAt(i)-'a'的偏移值来比较每个字符相对于a的总偏移量sum1和sum2,然后得到sum1和sum2相减的绝对值absoluteValue。这里就需要了解ASCII码表有一定的了解,会简单为大家介绍一下,通过char的强制转换将'a'与absoluteValue之和转换为两个相差的字母,如果看到这里你还没懂,别着急,我们继续往下看。

当我做完这道题后发现如果需要比较给定的两个长度较长的字符串,这种方法非常方便且高效,基本就不需要人工来找。

二、初步实现(思路变代码)

1.ASCII码表

ASCII表提供了一种简单而一致的方式来表示数字、大写字母、小写字母、常见符号和控制字符等字符。通过ASCII表,计算机可以将字符转换为对应的数字编码,从而在内存中存储、传输和处理字符数据。

ASCII表中的每个字符都有一个唯一的数字值(0-127),通过这些数字值可以在计算机中表示和存储字符。例如,大写字母"A"对应的ASCII码是65,小写字母"a"对应的ASCII码是97,数字"0"对应的ASCII码是48等等。

理解:绝大部分单个字符可以统一以数字编码的形式呈现

注意:不要混淆普通数字与ascii表中的数字编码

数字0-9对应的ASCII码(十进制)为“48”-“57”
大写字母A-Z对应的ASCII码(十进制)为“65”-“90”
小写字母a-z对应的百ASCII码(十进制)为"97"-“122”

ASCII表作为一种标准化的字符编码方案,为计算机和信息技术领域提供了重要的基础,使得字符数据能够被准确、高效地处理和传输。

2.Math类

在Java中,Math类是一个包含用于执行基本数学运算的静态方法的内置类。以下是Math类中一些常用的方法。

abs():返回一个数的绝对值。
max():返回两个参数中的较大值。
min():返回两个参数中的较小值。

3.比特位

当我们谈论比特位时,实际上是在讨论计算机中最小的存储单位 - 位(bit)。计算机中的数据以位为单位进行存储和处理。每个位只能存储0或1这两种状态,代表逻辑上的“关闭”或“开启”。

多个位组合在一起可以表示更复杂的数据。比特位通常按照8位组合成一个字节(byte),一个字节可以表示256种不同的状态(2^8)。除了字节之外,还有其他位组合方式,如半字节(nibble,4位组合)、字(word,通常是2个或4个字节组合)、双字(double word,8字节组合)等。这些不同的位组合方式可以用来表示不同范围的数值或数据。

为什么要提到这个东西呢?原本准备在丰富思路里介绍一下别人提供的异或位方法,但考虑到不常用就只在这里简单介绍一下相关知识,不做过多赘述了。

4.代码(通用版)

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        int difference = Math.abs(s1.length()-s2.length());
        if(difference>1 || difference==0){
            return;
        } else if (difference==1) {
            int sum1 = 0;
            int sum2 = 0 ;
            for(int i = 0; i < s1.length(); i++){
                sum1 += s1.charAt(i)-'a';

            }
            for(int i = 0; i < s2.length(); i++){
                sum2 += s2.charAt(i)-'a';
            }
            int delta = Math.abs(sum2-sum1);
            char differentChar = (char)(delta+'a');
            System.out.println(differentChar);

        }
        sc.close();
    }
}

三、丰富思路(阅读参考他人题解)

1.秒杀示例

因为这里是展示的别人的代码,我就通过截图来给大家展示了。

2.收获

短短几行代码就搞定了一道题,其中“自加”和利用toCharArray方法的思路是以后我们也可以参考的。这里再介绍一下toCharArray方法:

toCharArray() 是 Java 中 String 类提供的一个方法,用于将字符串转换为字符数组。该方法会创建一个新的字符数组,其中包含了字符串中的每一个字符。每个字符在字符数组中的位置和在原字符串中的位置是对应的。

toCharArray() 方法在处理需要对字符串中的每个字符进行单独处理的情况下非常有用。

总结:这个方法可以一步到位实现字符串到数组之间的转化。

四、完整代码

这个版本的更容易理解一下。

public class Main {
    //Scanner sc = new Scanner(System.in);
    String s1 ;
    String s2 ;

    public void getFrequency(String s1,String s2){
        this.s1=s1;
        this.s2=s2;

        int difference = Math.abs(s1.length()-s2.length());
        //int minLength = Math.min(s1.length(),s2.length());

        if(difference>1 || difference==0){
            System.out.print("请输入长度最多相差只有一个字符的两个字符串");
            return;
        } else if (difference==1) {
            int sum1 = 0;
            int sum2 = 0 ;
            for(int i = 0; i < s1.length(); i++){
                sum1 += s1.charAt(i)-'a';

            }
            for(int i = 0; i < s2.length(); i++){
                sum2 += s2.charAt(i)-'a';
            }
            int delta =Math.abs(sum2-sum1);
            char differentChar =(char)(delta+'a');
            System.out.println("不同的字母是:"+differentChar );

        }

        }

    public static void main(String[] args) {
       Main main = new Main();
       main.getFrequency("abbcdef","acbdeb");
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662118.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

E. Binary Deque[双指针好思维题]

Binary Deque 题面翻译 有多组数据。 每组数据给出 n n n 个数&#xff0c;每个数为 0 0 0 或 1 1 1 。你可以选择从两边删数&#xff0c;求至少删几个数才可以使剩下的数总和为 s s s 。 如果不能达到 s s s &#xff0c;则输出 − 1 -1 −1 。 题目描述 Slavic h…

性能测试(基于Jmeter)

性能指标 RT&#xff08;Response Time&#xff09;响应时间&#xff1a;指的是用户从客户端发起请求开始到服务端返回结束&#xff0c;整个过程所耗费的时间 HPS&#xff08;Hits Per Second&#xff09;&#xff1a; 每秒点击次数&#xff0c;单位&#xff1a;次/秒 TPS&am…

Element-Plus中表格及分页功能

导入Element-Plus 具体步骤如下&#xff1a;&#xff08;内容参照官网&#xff1a;安装 | Element Plus&#xff09; # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus 在main.js文件的…

树与图的深度优先遍历

数和图的存储方式与遍历 数和图的存储方式&#xff1a; 一般有两种 树是一种特殊的图&#xff08;即无环联通图&#xff09;。所以下面只讲图。 图的话分为两种&#xff1a;①有向图&#xff08;边是有方向的&#xff1a;a➡️b&#xff09;和 ②无向图&#xff08;边是无方…

安全设计 | Microsoft 威胁建模工具Threat Modeling Tool安装、使用及威胁生成原理详解(文末附样例)

1. 概览 微软威胁建模工具&#xff08;Threat Modeling Tool&#xff09;是 Microsoft 安全开发生命周期 (SDL&#xff0c;Security Development LifeCycle) 的核心要素。 当潜在安全问题处于无需花费过多成本即可相对容易解决的阶段&#xff0c;软件架构师可以使用威胁建模工…

断开自定义模块与自定义库的链接

断开自定义模块与自定义库的链接 1、断开模块与库的链接 1、断开模块与库的链接 如果摸个库文件添加到模型中&#xff0c;无法“Disable Link”时&#xff0c;可以使用save_system命令进行断开到模型中用户定义的库模块的链接&#xff1b; 参考链接&#xff1a; 传送门 save…

Python词法和语法分析工具库之ply使用详解

概要 在编程语言的开发、编译器的实现和数据解析等领域,词法分析和语法分析是关键的技术。Python的ply库是一个功能强大的词法和语法分析工具,基于经典的Lex和Yacc工具实现。ply库为开发者提供了一种简单且高效的方法,用于定义词法规则和语法规则,从而实现对自定义语言和数…

现货白银交易点差是多少

现货白银投资者通过交易平台进行买卖操作的时候&#xff0c;平台会以“点差”的形式向投资者收取一定的交易费用。所谓的点差&#xff0c;也就是平台所报出的买入价和卖出价之间的固定差额&#xff0c;由于现货白银的报价是“成对”的&#xff0c;所以点差的存在也是其交易模式…

【SpringMVC】_SpringMVC项目返回HTML与JSON

目录 1. SpringMVC项目返回HTML页面 2. SpringMVC项目返回JSON 2.1 程序演示 2.2 关于响应的Content-Type 2.2.1 接口为对象 2.2.2 接口为String 2.2.3 接口为Map 本专栏已介绍&#xff1a; 返回静态页面&#xff1a; 【Spring MVC】_SpringMVC项目返回静态页面_mvc 返…

2024了,还有人在问为甚死锁?

大家好&#xff0c;我是javapub。 接上篇提到了锁&#xff0c;《InnoDB有哪些锁类型》。这么多的锁&#xff0c;你有遇到过死锁吗&#xff1f; 死锁是在事务数据库中会发生的一种特殊现象&#xff0c;多个事务在执行过程中&#xff0c;相互等待对方持有的资源&#xff0c;导致…

软件游戏缺失d3dcompiler_47.dll如何解决,简单有效的五种解决方法分享

在现代游戏中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dcompiler47.dll文件”。这个问题通常会导致游戏无法正常运行或出现崩溃的情况。为了解决这个问题&#xff0c;我总结出了以下五种解决方法。希望这些方法能够帮助到遇到相同问题的玩家。 …

论文解读之A General-Purpose Self-Supervised Model for Computational Pathology

一、前言 目前&#xff0c;有很多无知者认为计算机在疾病诊断上超过了人类&#xff0c;他们的理解是计算机在美丽国的某个什么医师测评上得分超过了人类。这比较可笑和无知。 笔者认为&#xff1a;病理图像的病症复杂、种类繁多&#xff0c;同时数据集很少并且标注极为困难。…

学习笔记——动态路由协议——OSPF(简介)

一、 OSPF简介 1、前言 由于静态路由由网络管理员手工配置&#xff0c;因此当网络发生变化时&#xff0c;静态路由需要手动调整&#xff0c;这制约了静态路由在现网大规模的应用。 动态路由协议因其灵活性高、可靠性好、易于扩展等特点被广泛应用于现网。在动态路由协议之中…

数字工厂管理系统可以和哪些软件集成

随着工业4.0时代的到来&#xff0c;数字工厂管理系统已成为制造业转型升级的核心驱动力。数字工厂管理系统通过集成各种软件和技术&#xff0c;实现了生产过程的数字化、网络化和智能化&#xff0c;大大提高了生产效率和管理水平。本文将探讨数字工厂管理系统可以与哪些软件集成…

在table表格中如何给tr的每一个子元素加haver效果

效果图&#xff1a; 核心代码&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改变子元素 tbody tr:hover {background-color: #d5d5d5; } 改变父元素 两段代码看起来一样&#xff0c;其实不一样&#xff0c;其中差了一个空格字符 希望可以帮到大家

Xilinx FPGA中的BUFFER

FPGA大型设计中推荐使用同步时序电路&#xff0c;同步时序电路基于时钟触发沿设计&#xff0c;对时钟的周期、占空比、延时和抖动有更高的要求。为满足时序的要求&#xff0c;一般采用全局时钟资源驱动设计的主时钟&#xff0c;FPGA的主时钟一般使用全铜层工艺实现&#xff0c;…

服务器内存与CPU要占用多少才合理?

一 通常服务器内存占用多少合理&#xff1f;cpu占用多少才合理&#xff1f; 1 通常配置范围建议&#xff1a; 建议CPU使用率不高于80%&#xff1b;内存使用率不高于80%&#xff1b; 注意&#xff1a;具体情况还需要根据服务器的实际负载和应用场景来判断。 2 内存使用率&…

揭秘智慧校园:可视化技术引领教育新篇章

随着科技的飞速发展&#xff0c;我们的生活方式正在经历一场前所未有的变革。而在这场变革中&#xff0c;学校作为培养未来人才的重要基地&#xff0c;也在不断地探索与创新。 一、什么是校园可视化&#xff1f; 校园可视化&#xff0c;就是通过先进的信息技术&#xff0c;将学…

光纤现网与接入网概念对应

OLT 一般在机房 一级分光可能在机房也可能在光交交接箱 路边的光交交接箱功能有分光或者光纤汇聚转换一下 二级分光在分光光纤箱里&#xff0c;楼道里面挂着的那种 ONU是家里的光猫

喜讯 | 盘古信息冠捷科技、锐明科技IMS项目荣获创新案例、优秀案例

5月28日&#xff0c;中国数据要素及行业应用创新大会盛大启幕&#xff0c;现场汇聚了中国工程院院士、数据要素研究机构及数据要素知名企业、数字要素行业生态代表等300位业内相关人士。广东盘古信息科技股份有限公司副总经理朱熀锋代表盘古信息出席大会&#xff0c;并带来了IM…