【java面试题】不定义新变量的情况下交换两个Integer变量_java 不定义新变量交换值

}


首先完善swap先,这题目还有关于java到底是引用传递还是值传递的问题。


解题思路:  
 没有引入新变量的话,只能在a、b之间互相计算,将两个变量值信息混合在一起赋值给其中一个变量如a保存,再用另外一个变量b将混合变量a分离出a值赋值给b,那么现在b变量就是原来a的值,再用现在b变量(即原来的a的值)去将混合变量分离出b原来的值赋值给a。这样就可以实现没有新变量值就可以交换值。而其中的混合算法和分离算法很重要,要保证求值的唯一性(即y=fun(x),一个x值只能有一个y值对应)。下面给出三种算法:  
 **1、异或算法**



public class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;

    swap(a, b);

    System.out.printf("a is %d,b is %d", a, b);
}

public static void swap(Integer a, Integer b) {
    a = a ^ b;//混合算法
    b = a ^ b;//分离算法
    a = a ^ b;//分离算法
    System.out.printf(" a is %d,b is %d \n", a, b);
}

}


运行结果:



a is 20,b is 10
a is 10,b is 20


为什么异或算法可以?因为它满足唯一性,例如 1 和 0的异或是1 ,1和1的异或是0,  
 反推的话,知道了异或结果是1,而一个值为1,那么另外一个参与异或的必定是0。


具体举个例子:



a = 10101
b = 10011


a^b = 00110



a = 10101
b = 10011

00110   

将异或结果与a异或可以求出b,得出的结果是 10101,等于b的值



a^b = 00110
a = 10011

  10101

也就是可以得出一个结论:  
 若 `c=a^b`, 那么 `a= c^b`,`b=c^a`;


**2、加减法**


代码:



public class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
swap(a, b);
System.out.printf(“a is %d,b is %d”, a, b);
}
public static void swap(Integer a, Integer b) {
a = a + b;
b = a - b;
a = a - b;
System.out.printf(" a is %d,b is %d \n", a, b);
}
}


运行结果:



a is 20,b is 10
a is 10,b is 20


加减法的原理很好理解,`c= a+b, a= c-b,b= c-a。`


**3、乘除法**  
 代码:



public class Main {
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
swap(a, b);
System.out.printf(“a is %d,b is %d”, a, b);
}
public static void swap(Integer a, Integer b) {
a = a * b;
b = a / b;
a = a / b;
System.out.printf(" a is %d,b is %d \n", a, b);
}
}


运行结果:



a is 20,b is 10
a is 10,b is 20


乘除法的原理也很简单:`c= a*b , a= c / b ,b= c / a;`


**4、讨论**  
 **4.1 与算法行不行?**


举个例子: `1 与 0 结果是0,反过来,知道了与的结果是0,一个值为1,那么可以推出,另外一个值必定是0`。但是要是一下面这种情况就失效了,知道了与的结果是0,一个值为0,`那么推出另外一个值可能为0,也可能1`,这种模棱两可的结果不满足推导结果的唯一性,所以就不能用在这道题中。



### 计算机网络

*   HTTP 缓存

*   你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

*   HTTP 常用的请求方式,区别和用途?

*   HTTPS 是什么?具体流程

*   三次握手和四次挥手

*   你对 TCP 滑动窗口有了解嘛?

*   WebSocket与Ajax的区别

*   了解 WebSocket 嘛?

*   HTTP 如何实现长连接?在什么时候会超时?

*   TCP 如何保证有效传输及拥塞控制原理。

*   TCP 协议怎么保证可靠的,UDP 为什么不可靠?


![](https://img-blog.csdnimg.cn/img_convert/614771dc66a0fec7a3e33c2c7e1fa878.png)



### 算法

* 链表

* 字符串

* 数组问题

* 二叉树

* 排序算法

* 二分查找

* 动态规划

* BFS

* 栈

* DFS

* 回溯算法

  ![](https://img-blog.csdnimg.cn/img_convert/6c250b6200355d0edce85b970db267bd.png)
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值