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