- 序、专栏前言
- 一、什么是ASCII?
- 二、【例题2】
- 2、解题思路
- 3、模板代码
- 4 、代码解析
- 三、【例题2】
- 2、解题思路
- 3、模板代码
- 4 、代码解析
- 四、奇淫巧技
- 五、推荐专栏
- 六、课后习题
本专栏开启,目的在于帮助大家更好的掌握学习Java,特别是一些Java学习者难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
在我们肉眼中,任何一个字符和数字差距都是很大的,长得完全不一样。但在计算机中,任何数据都是以二进制代码存储,即使是字符它也得转换成二进制代码,而这个二进制代码所对应的十进制数,就是该字符所对应的ASCII码。
ASCII表记录了每个字符用什么数字去表示,这也更像一种规定,擅用好ASCII能大幅度帮我们简化运算。但其实也不必担心一定要背下来,我们只需要每次要用的时候查一下,久而久之就能记住常用的一些字符。比如小写的26个字母
[
a
,
z
]
[a,z]
[a,z]的ASCII码对应的范围是
[
97
,
122
]
[97,122]
[97,122],而大写的
[
A
,
Z
]
[A,Z]
[A,Z]则会小一点,对应的是区间
[
65
,
90
]
[65,90]
[65,90]。字符数字
[
0
,
9
]
[0,9]
[0,9]则对应的是
[
48
,
57
]
[48,57]
[48,57]。
由于这些常用的字符的ASCII码都是连续的,所以我们只需要记住开头的如:a,A,0的ASCII值即可,然后根据差值加上对应的值即可。比如d和a相差3,我们只需要让a的ASCII码也就是97加上3就是我们d的ASCII码——是100。其他同理。
2、解题思路给定多组测试用例,每次给定一个小写字符t,请你将它转化为大写进行输出。
题目难度:⭐️
对于任意一对大小写字母,它们的ASCII码的差值都是相同的。我们只需要对每个输入字符t减去这个差值即可得到大写T的ASCII码。当然这个差值我们也不需要去背,随便找一大一小的字符相减即可得到,比如A-a。字符参与运算的时候会自动转化为ASCII码进行运算。
3、模板代码import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
char c=sc.next().charAt(0);
char s=(char)(c-('a'-'A'));
System.out.println(s);
}
}
}
4 、代码解析
- ( 1 ) (1) (1)由于是多组测试数据,所以需要使用hasNext方法,这点我们前面讲过。
- ( 2 ) (2) (2)由于Java中并未带读入字符的函数,所以我们需要当成字符串进行读入,如果使用charAt方法取出第一个字符。
- ( 3 ) (3) (3)根据解题思路说的,我们需要只需要让小写字符t减去差值即可得到大写的字符T的ASCII,但是我们需要的是字符,所以需要进行强转。
- ( 4 ) (4) (4)当然我们也可以使用printf格式化输出
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
char c=sc.next().charAt(0);
int s=(c-('a'-'A'));
System.out.printf("%c",s);
}
}
}
三、【例题2】
2、解题思路给定多组测试用例,每次给定一个字符串s,其中包含大写字符和小写字符以及其他各种符号,请你只保留其中的26个字母,并将小写字母转换为大写字母然后输出。
题目难度:⭐️⭐️
这道题与上一题的区别在于,我们需要将一个字符串内部的所有字符转化为小写字符。由于Java中的String是不可变的,我们需要使用StringBuilder记录答案。对于原字符串每一个字符进行判断,如果已经是大写字符我们直接加入答案,如果是小写则转化为大写后加入答案,对于其他的符号我们直接省略掉。
3、模板代码import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
String s=sc.next();
StringBuilder sb=new StringBuilder();
for (int i = 0; i
char c=s.charAt(i);
if ('A'<=c&&c<='Z') sb.append(c);
else if ('a'<=c&&c<='z'){
int g=c-('a'-'A');
sb.append((char)g);
}
}
System.out.println(sb);
}
}
}
4 、代码解析
- ( 1 ) (1) (1)StringBuilder是Java中的一个可变字符串类型,append方法可以在末尾加上给定的参数。
- ( 2 ) (2) (2)对于s中的每一个字符,我们在第10行,判断其是否是大写字符,还是通过ASCII去进行判断,如果是则可以直接加入答案即可。
-
(
3
)
(3)
(3)当我们判断到是小写字符时,则需要获得它大写字符的ASCII码,最后强转为char类型后加入答案。
当然对于字符转换我们也有着一些奇淫巧技,对于任意一对大小写字符ASCII的值相差32。
- ( 1 ) (1) (1)大变小,小变大。我们可以直接s^=32,对32进行异或即可。
- ( 2 ) (2) (2)大变小,小变小。我们可以直接s|=32,对32进行按位或。
-
(
3
)
(3)
(3)小变大,大变大。我们可以直接s&=-33,对-33进行按位与。
具体原理涉及到位运算不展开细讲。
| 序号 | 题目链接 | 难度评级 |
|---|---|---|
| 1 | 解码字母到整数映射 | 2 |
| 2 | 转换为小写字母 | 1 |



