本文已收录于专栏
🌸《Java入门一百例》🌸
序、专栏前言
?? 本专栏开启,目的在于帮助大家更好的掌握学习Java ,特别是一些Java学习者 难以在网上找到系统地算法学习资料帮助自身入门算法,同时对于专栏内的内容有任何疑问都可在文章末尾添加我的微信给你进行一对一的讲解。 ?? 但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。 ?? 算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。 ??学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
一、【例题1】
??给定多组测试数据,每次给定一个字符串
S
S
S,对你把它进行翻转后输出。
2、解题思路
??题目难度:??
??首先要清楚,在Java 语言中,默认的字符串类似String 是不可变的。所以我们考虑把它转化为字符数组char[] 进行操作,或者使用可变的字符串类型StringBuilder 进行操作。
3、模板代码
1、方法1
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().toCharArray();
int l=0;
int r=c.length-1;
while (l<r){
char a=c[l];
c[l]=c[r];
c[r]=a;
l++;
r--;
}
String s=new String(c);
System.out.println(s);
}
}
}
2、方法2
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();
int n=s.length();
StringBuilder sb=new StringBuilder();
for (int i = n-1; i >=0; i--) {
sb.append(s.charAt(i));
}
System.out.println(sb);
}
}
}
3、方法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(s);
sb.reverse();
System.out.println(sb);
}
}
}
4 、代码解析
-
(
1
)
(1)
(1)方法
1
1
1中,我们将字符串转化字符数组
char[] 操作,使用双指针 算法两两交换头尾的字符,最终完成操作。第16 行代码中String 有一个构造方法可以传入一个char[] 拼接成字符串,但是这个方式太麻烦不推荐大家使用。 -
(
2
)
(2)
(2)方法
2
2
2中我们使用一个空的
StringBuilder 接受答案,只需要把原有的String 倒着遍历一遍加入到StringBuilder 即可,最后进行输出。 -
(
3
)
(3)
(3)
StringBuilder 自带有reverse 翻转函数,它也有一个构造方法可以接收String 为参数。我们只需要调用reverse 进行翻转即可。这才是我们常使用的方式。
二、【例题2】
??给定多组测试数据,每次给定一个整数
x
x
x。请你对它进行翻转输出,题目保证翻转的结果不会超出了int 的取值范围。
2、解题思路
??题目难度:????
??这道题我们应该注意到负数的情况,因为如果直接转化为字符串使用reverse 是会出问题的。我们可以考虑通过利用取余% 操作来完成。
3、模板代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int x=sc.nextInt();
int res=0;
while (x!=0){
int b=x%10;
x/=10;
res=res*10+b;
}
System.out.println(res);
}
}
}
4 、代码解析
-
(
1
)
(1)
(1)我们取余
% ,是每次取出x 的最低位数,然后加在res 的后面,每次要加之前都得先乘以10 ,整体向左移动一位再加入,这样得到的整数和原数组就是相反的。 -
(
2
)
(2)
(2)为什么能解决负数的情况呢?因为负数取模得到的数也会是负数。比如
-123 ,取模一次得到的并不是3 ,而是-3 。然后接着是-2 和-1 。 这样得到的数通过我们的运算得到的是:
(
?
3
)
×
100
+
(
?
2
)
×
10
+
(
?
1
)
=
?
321
(-3)×100+(-2)×10+(-1)=-321
(?3)×100+(?2)×10+(?1)=?321 而-321 正好就是-123 翻转后的结果,如果使用reverse 得到的结果就会是321- 。
三、推荐专栏
🌌《零基础学算法100天》🌌
四、课后习题
👇 学习有疑问?👇
|