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

news2024/12/23 13:08:03

写在开头:很久没有开启有关算法的内容了,在正式开启开启今天这段算法之旅之前,跟大家谈一谈上周五歌手也就是第二期我的一些直观感受:相比第一期(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");
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用docker+jenkins构建前端项目发布到nginx

1.准备环境 为了方便公司开发优化代码&#xff0c;不需要反复地将项目包发送给运维部署&#xff0c;我们对开发环境的前端项目利用jenkinsCI/CD进行自动化部署 需要两台服务器 一台jenkins 一台发布服务器,这里发布服务器 我直接使用开发环境的服务器 将admin界面与云计算展示…

优化电源设计:反激二极管选择与注意事项

反激二极管也被称为续流二极管、缓冲二极管、抑制二极管、钳位二极管或换向二极管&#xff0c;是一种电子元件&#xff0c;通常应用在开关电源和其他涉及电感性负载的电路中。它的主要功能是保护电路&#xff0c;防止感性负载在开关断开时产生的反激电压&#xff08;或反电动势…

Paddle 傅里叶变换基础及领域应用

Paddle 傅里叶变换基础及领域应用 1. 傅里叶变换基础 1.1 傅里叶变换简介 傅里叶变换是一种重要的信号处理技术&#xff0c;它可以将一个信号从时域转换到频域。在频域中&#xff0c;信号的频率特性更加明显&#xff0c;有利于分析和处理。傅里叶变换的基本思想是将一个信号…

P6【知识点】【数据结构】【树tree】C++版

树是由一个集合以及在该集合上定义的一种关系构成的&#xff0c;集合中的元素称为树的结点&#xff0c;所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构&#xff0c;在这种层次结构中有一个结点具有特殊的地位&#xff0c;这个结点称为该树的根结点。 二叉…

接口测试怎么测?为什么要做接口测试?

一、前言 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间及内部各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理过程&#xff0c;以及系统间的逻辑依赖关系等。 简单地说&#xff0c;接口测试就是通过URL向服务器或者…

【强训笔记】day25

NO.1 思路&#xff1a;哈希质数判断。 代码实现&#xff1a; #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…

AppInventor2要在界面上做一个电量图标,有什么好的思路吗?

问&#xff1a;要在界面上做一个电量图标&#xff0c;有什么好的思路吗&#xff1f; 答&#xff1a;首先&#xff0c;很容易想到使用进度条相关的组件&#xff0c;原生”滑动条“组件可以吗&#xff1f; 答案显而易见&#xff0c;首先它的样式自定义不够&#xff0c;UI不外乎上…

cPanel中如何为数据库添加用户权限

本周有一个客户&#xff0c;购买Hostease的主机&#xff0c;询问我们的在线客服&#xff0c;他的网站安装后再还是无法访问。 客户购买的是Linux虚拟主机&#xff0c;带cPanel面板的。网站访问有如下数据库连接错误: 随后检查发现客户创建的数据库没有添加数据库用户权限。 下面…

企业文件加密软件推荐:迅软DSE加密软件你用了吗?

一、挑选企业文件加密软件需考虑的因素&#xff1f; 1、安全性&#xff1a;软件应采用业界认可的强加密算法&#xff0c;以确保数据的安全性。 迅软特有的256位高强度加密算法&#xff0c;从根本上阻止一切破解的可能性。 2、易用性&#xff1a;软件应该易于部署和管理&…

二进制部署k8s集群 部署高可用master节点

目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建 etcd &…

K8S认证|CKA题库+答案| 2. 查看Pod CPU资源使用量

2、查看集群中运行Pod CPU资源使用量 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s …

java集合类详解

目录 1、数组导入&#xff1a; 2、单列集合 List接口 1、ArrayList&#xff1a;数组列表 ArrayList类中的方法 2、LinkedList&#xff1a;链表列表 3、Vector&#xff1a;数组列表 4、list集合的遍历 1、for循环遍历 2、增强for循环 3、迭代器遍历 Set接口 1、Has…

word-形状绘制、smartart、visio

一、人员架构图绘制 小技巧&#xff1a; 1、ctrlshift水平复制 2、点击图形&#xff0c;右键设置为默认形状 3、插入-形状-右键-锁定绘图模式&#xff0c;按esc退出状态 4、插入-形状-新建绘图画布&#xff0c;代替组合问题 画布中存在锚点&#xff0c;便于直线连接 二、s…

LP-MSPM03507学习资料汇总

&#xff08;因对MSPM0研究不够深入&#xff0c;故暂不开启浏览权限&#xff0c;权当记录学习。但愿尽快掌握供大家免费阅读。有意者可私信我共同学习&#xff09; 一、延时函数 1、滴答定时器SYSTICK 1.1 SysConfig配置 配置1ms延时函数&#xff0c;并开启中断 1.2 编写延时…

Day21:Leetcode513.找树左下角的值 +112. 路径总和 113.路径总和ii + 106.从中序与后序遍历序列构造二叉树

LeetCode&#xff1a;513.找树左下角的值 解决方案&#xff1a; 1.思路 在遍历一个节点时&#xff0c;需要先把它的非空右子节点放入队列&#xff0c;然后再把它的非空左子节点放入队列&#xff0c;这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点…

php基础笔记

开端&#xff1a; PHP 脚本可以放在文本的任意位置 PHP 脚本以 开始&#xff0c;以 ?>** 结束&#xff1a; PHP 文件的默认文件扩展名是 ".php" 标签替换 <? echo 123;?> //short_open_tagson 默认开启 <?(表达式)?> 等价于 <?php echo …

Servlet 的 API

HttpServlet init&#xff1a;当 tomcat 收到了 /hello 这样的路径是请求后就会调用 HelloServlet&#xff0c;于是就需要对 HelloServlet 进行实例化&#xff08;只实例一次&#xff0c;后续再有请求也不实例了&#xff09;。 destory&#xff1a;如果是通过 smart tomcat 的停…

基础常用动词,柯桥西班牙语培训

1. Ser&#xff1a;是 表示身份: Soy Ana. Soy estudiante. 我是安娜。我是一名学生。 表示属性: Es duro. 这是硬的。 表示国籍: Soy espaol, de Madrid. 我是西班牙人&#xff0c;来自马德里。 2. Estar: 是..., 在... 表示身体状况: Estoy muy cansada, necesito dormir.我很…

springboot3项目练习详细步骤(第四部分:文件上传、登录优化、多环境开发)

目录 本地文件上传 接口文档 业务实现 登录优化 SpringBoot集成redis 实现令牌主动失效机制 多环境开发 本地文件上传 接口文档 业务实现 创建FileUploadController类并编写请求方法 RestController public class FileUploadController {PostMapping("/upload&…

英码科技算能系列边缘计算盒子再添新成员!搭载TPU处理器BM1688CV186AH,功耗更低、接口更丰富

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;英码科技凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒…