> 文档中心 > 面试题解(Day03)

面试题解(Day03)


前面的话

博客主页:hyhWTX的博客主页

欢迎关注🖱点赞🎀收藏⭐留言✒

本文由hyhWTX原创,csdn首发!

系列专栏:面试题解

🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦

题目五

两个元素交换的问题,怎样不借用更多的变量来更换两个元素的值。

public class Test05 {    public static void main(String[] args) { int a = 10; int b = 50; //在不设置其他变量的条件下,交换a,b的值 System.out.println(a); System.out.println(b);    }}

其实我们平时遇到这种题的时候,我们的第一反应就是设置一个中间变量来进行操作,比如说是这样的,🍭🍭🍭

public class Test05 {    public static void main(String[] args) { int a = 10; int b = 50; int c=a; a=b; b=c; System.out.println(a); System.out.println(b);    }}

虽然很方便,也很快速。🍠🍠🍠,但是,如果我们的代码量稍稍多一些,程序复杂一些的情况下,我们在使用这种方式的时候,就会使得代码量增加,代码显得很是冗杂,不便于我们进行阅读和分析,此外,设置的变量越多,我们在阅读的时候就会很容易迷糊,从而使得我们阅读出错,给我们带来不必要的烦恼。

解决方案

基于以上的问题,我们使用不借助变量的方法来交换两个数值。我们我们可以这样做,第一步,我们使用a = a+b; ,因为题目只要求了我们不要使用中间变量,但是却没有说它不能进行计算。我们使用a = a +b;,我们讲a+b的和存储在a中,所以这样的结果就是,我们在这一步是进行了将a+b的结果存储在了a中去,没有改变b的值。执行了这一轮的操作后,a的值被改变,它就是a和b的和,也就是60。b的值没有发生改变,所以b的值还是原来的数值,即50。第二步,我们使用b =a-b;,大家可以看啊,就是我们上一步是进行的对a的运算,所以现在在这里,a的值就是60,b在上一步没有发生改变,所以,它其实还是50。那么在这里执行的b = b -a 的意思就是,使用上一步的结果a来减去b,剩下的数值就是原来的a,这一步它的目的就是将原来a的值计算出来,并赋值给b。因为这一轮b做了赋值,所以这一轮的结果就是b的值就是10,a的值没有发生变化,所以它还是60。第三步,我们使用a = a -b;,在这一步里,a其实还是第一步执行出来的和(在第二步的时候没有发生改变),b其实就是初始时的a了,所以,这一步的意思就是,我们用第一步执行下来的和a(60),来减去第二步计算出来的b(10)的值,来得到初始状态下的b的值并赋值给a,这一步的目的是啥,就是将原来b的值赋值给a,a的值发生变化,它的值就是50,b没有发生改变,它的值就是10。通过以上三步的执行,从而达到了数值交换的目的。

public class Test05 {    public static void main(String[] args) { int a = 10; int b = 50; //在不设置其他变量的条件下,交换a,b的值 a = a+b; b= a -b; a = a-b; System.out.println(a); System.out.println(b);    }}

总结与不足

虽然以上的方法避免了中间变量的使用,但是这个方法依旧不是很完美。因为它是在中间产生了一个加和的操作,如果我们没有核对清楚的情况下,我们很容易犯一个越界的问题。很多人可能会有疑问,你不是使用的是int型数据吗?它的取值范围是-2的31次方到2的31次方-1,它的范围还不够我们使用吗?但是,当我们真的在开发过程中,能保证我们使用的数值会很小吗?假设a和b的值取值是十分接近int的取值范围,当我们加和操作时,很难保证它不会越界。所以这也是值得我们思考的一个问题。

题目六

一道来自牛客网的面试模拟题

/** * @author hyhWTX * @version 1.0 * @date 2022年05月03日 23:15 */public class Test06 {    public static void main(String[] args) { System.out.println("is"+100+5); System.out.println(100+5+"is"); System.out.println("is"+(100+5));    }}

以上三句的输出语句是什么?

A is 1005 ,1005is , is 1005

B is 105 , 105 is ,is 105

C is 1005 , 1005 is , is 105

D is 1005 , 105 is ,is 105

解析过程

这道题其实很简单的,首先,这还是一道很简单的关于字符串拼接的以及数字加号得到问题。大家都能知道,两个数字加在一起的时候,就是一个很正常的四则运算的加法运算,但是如果遇到了这种双引号的,大家学了这么久的,也能知道这个双引号就是String类型的,也就是引用数据类型。所以引用类型的加号得当做拼接符或者连接符来使用

。我们都知道,在没有任何条件限制的情况下,这个加号是没有什么优先级的,所以是正常从左往右算。但是这种有小括号限制的,我们是需要先计算小括号的,而后再计算外边。

输出结果

所以我们看第一个就是正常的按照从左往右的顺序,先是双引号is,然后拼接一个100。拼接之后呢,就变成了一个双引号的字符串了,再往后的加号还是拼接。所以第一个输出语句就是‘is1005’。第二个呢,加号在左边,两个是数字,所以就是个数学的计算,结果就是105在拼接上一个is,输出结果就是‘105is’。第三个呢,是因为有小括号,所以先算加法运算,所以还是105,前面加号再拼接上一个is,输出结果就是‘105is

题目七

一道坑比较多的面试题。面试题目如下:

public class Test07 {    public static void main(String[] args) { int x = 5; boolean b1 = true; boolean b2 = false; if ((x==4)&&!b2)     System.out.println("1");     System.out.println("2");  if ((b2=true)&&b1)      System.out.println("3");    }}

以上的运行结果是:

​ A .2 B .3 C .1 2 D .2 3 E .1 2 3

F . Compilation fails

G .An exception is thrown at runtime

解析过程

这道题目可能初见觉得没什么,就是一道变量if语句的题目。但是这道题很经典, 有很多的坑。

第一个坑,大家可以看到,这个if语句之后它是没有大括号的;第二个呢,在if语句里面出现了一个短路与符号&&,那么正常的短路与和正常的逻辑与符号有什么区别呢?什么时候发生短路呢?第三个,很细节的一个点,在第二个的if语句里面。它只有一个等号。不知道你有没有发现。

答案解读

这道题目的答案是D选项。至于为什么是D选项呢!就由我来为大家解析。

第一个点,if之后没有大括号,好不好呢,其实是可以的,它是不会出现编译错误的问题。但是没有大括号会有什么问题呢?那就是之后的代码之中只有一行与if相关。大家有没有发现题目的鸡贼之处,它将里面的输出语句给对齐了。但是,这里面的输出2是和if没有半毛钱的关系的。所以,它之后没有大括号,它是只有第一句与if是相关的。

所以我们将语句结构更改之后呢,就是这样的。

public class Test07 {    public static void main(String[] args) { int x = 5; boolean b1 = true; boolean b2 = false; if ((x==4)&&!b2)     System.out.println("1"); System.out.println("2");  if ((b2=true)&&b1)      System.out.println("3");    }}

接下来我们来看。if之中,它是x==4,x之中存放的是5, ==4就是false,所以当前面的条件是false的时候,这个是短路与,也就是说,当前面的语句结果是false的时候,它就发生了短路,之后的结果就不会运行。所以第一个if就是false,那么false ,1就不会输出。但是2呢,它是与if没有关系的,所以2肯定会输出。

我们接着往下看这个if,这个if呢,里面是b2=true,我们都知道。通常情况下,一个等号是一个赋值符号,在if当中是很少出现一个等号的,但是就这道题目而言,就因为这里这个b2,它本身就是一个boolean型的,所以对于题目中的b2=true就是把true赋值给b2,那么剩下的这个变量b2里面存放的是啥呢?就是个true呀!所以这个if里面,前半句就是true呀,在与上一个b1,b1它也是一个boolean型的,它里面存放的也是true,相当于就是说,它前边的b2被赋值,赋值成了true,后面这个b1也是true,那么true与true的结果就是true,所以if满足,那么3就输出了。所以最后的输出结果就是2和3。
🎧最后的话,作者是一个新人,在很多方面还做的不好,欢迎大佬指正,一起学习哦,冲冲冲

松山湖网站