学习指引
- 序、专栏前言
- 序、本章前言
- 一、【例题1】
- 1、题目描述
- 2、解题思路
- 3、模板代码
- 1、临时变量法
- 2、算术运算法
- 3、异或交换法
- 4、三种方法对比。
- 三、推荐专栏
- 四、课后习题
序、专栏前言
本专栏开启,目的在于帮助大家更好的掌握学习Java
,特别是一些Java学习者
难以在网上找到系统地算法学习资料帮助自身入门算法
但最最主要的还是需要独立思考,对于本专栏的所有内容,能够进行完全掌握,自己完完全全将代码写过一遍,对于算法入门肯定是没有问题的。
算法的学习肯定不能缺少总结,这里我推荐大家可以到高校算法社区将学过的知识进行打卡,以此来进行巩固以及复习。
学好算法的唯一途径那一定是题海战略,大量练习的堆积才能练就一身本领。专栏的任何题目我将会从【题目描述】【解题思路】【模板代码】【代码解析】等四板块进行讲解。
序、本章前言
交换两个变量的值,这是一个再寻常不过的需求,但大部分人却仅仅只知道临时变量的交换方式,这也是大家常用的方法。但是在当今内卷的时代,这也能作为面试的考点了,不准你使用临时变量问你如何交换两个变量的值。今天我们也讲解最常用的三种方法。
一、【例题1】
1、题目描述
,请你交换两个变量的值,并打印它们的值。
2、解题思路
在Java
中并没有现成的函数来对两个变量进行交换值。但想完成这个操作也十分容易。好比你有两杯水a
和b
,让你交换两个杯子的水。你会想到怎么办?肯定是再拿一个空杯子c
,先把a
倒进c
,再把b
倒进a
,最后c
倒b
即可。最朴素的交换变量方法也是如此。
3、模板代码
1、临时变量法
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int a=sc.nextInt();
int b=sc.nextInt();
int c=0;
c=a;
a=b;
b=c;
System.out.println(a+" "+b);
}
}
}
c=a
,把的值给
a=b
,把的值给了
b=c
,把的值给
,而
的值恰好就是最开始时
的值。
- 至此完成变量交换任务。
2、算术运算法
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
long a=sc.nextLong();
long b=sc.nextLong();
a=a+b;//(1)
b=a-b;//(2)
a=a-b;//(3)
System.out.println(a+" "+b);
}
}
}
当
a=a+b
执行完成后,a
的值更新为a+b
的和。当
b=a-b
执行后,b
的值变为a+b-b
,即最开始a
的值。最后
a=a-b
执行后,a
的值变为a+b-a
,即最开始b
的值。因为数据范围太大,
a+b
的操作可能会爆int
,所以我们需要使用long
。- 至此完成变量交换任务。
3、异或交换法
下面讲解最神奇的一种交换方法——异或交换法。^
符号是位运算中的一门运算。对于两个数的二进制,如果相同位不同则为1
,相同则0
。所以异或运算有下面几条比较重要的性质:
两个相同的数异或的结果为
0
。任何一个数和
0
异或的结果是它本身异或运算满足结合律和交换律
当
a^b=c
时,同样有a^c=b
和b^c=a
。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
int a=sc.nextInt();
int b=sc.nextInt();
a=a^b;
b=a^b;
a=a^b;
System.out.println(a+" "+b);
}
}
}
当
a^b
会得到一个结果c
,此时a
等于c
。当
b=a^b
时,也就是b=c^b
,此时b
的值变为最开始的a
。当
a=a^b
时,也就是a=a^c
,此时a
的值变为最开始的b
。- 至此完成变量交换任务。
4、三种方法对比。
方法1是我们平时最常用的,方法2有缺陷不推荐,方法3需要了解掌握,但平时并不太推荐使用,因为可读性不好,有的人并不明白这段代码是和作用。所以还是推荐使用方法1。
课后习题
序号 | 题目链接 | 难度评级 |
1 | 交换数字 | 1 |