面试题 16.01. 交换数字:
编写一个函数,不用临时变量,直接交换numbers = [a, b]
中a
与b
的值。
样例 1:
输入:
numbers = [1,2]
输出:
[2,1]
提示:
- numbers.length == 2
- -2147483647 <= numbers[i] <= 2147483647
分析
- 面对这道算法题目,需要稍微考虑下。
- 通常交换都是需要一个临时变量的,但是本题要求不能用临时变量,所以需要考虑我们为什么需要临时变量。
- 交换a和b两个变量的值,需要先把a的值暂存,然后b的值存入a,再把暂存的值存入b。
a->temp
b->a
temp->b
- 如果没有临时变量,那么就不能直接用变量b的值覆盖变量a的值,必须是在变量a的值里既保存原值,又能把变量b的值存进去。
- 如果两个值的取值范围比较小,其实可以在变量a里存变量a与变量b的和,然后用和减去变量b的值赋值给变量b,此时变量a的值是变量a与变量b的和,变量b存放变量a的值,再如法炮制即可完成交换。
a+b->a
a-b->b
a-b->a
- 但是提示中整数的取值范围是32位有符号数,没办法用加法的方式,会溢出。
- 如果按照位来考虑,先把变量a的值的赋值为变量a和变量b每一位是否相等,有了这个值,则可以根据变量b的值算出变量a的值,也可以根据变量a的值算出变量b的值。
题解
java
class Solution {
public int[] swapNumbers(int[] numbers) {
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
}
c
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* swapNumbers(int* numbers, int numbersSize, int* returnSize){
*returnSize = numbersSize;
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
c++
class Solution {
public:
vector<int> swapNumbers(vector<int>& numbers) {
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
};
python
class Solution:
def swapNumbers(self, numbers: List[int]) -> List[int]:
numbers[0] ^= numbers[1]
numbers[1] ^= numbers[0]
numbers[0] ^= numbers[1]
return numbers
go
func swapNumbers(numbers []int) []int {
numbers[0] ^= numbers[1]
numbers[1] ^= numbers[0]
numbers[0] ^= numbers[1]
return numbers
}
rust
impl Solution {
pub fn swap_numbers(mut numbers: Vec<i32>) -> Vec<i32> {
numbers[0] ^= numbers[1];
numbers[1] ^= numbers[0];
numbers[0] ^= numbers[1];
return numbers;
}
}
原题传送门:https://leetcode-cn.com/problems/swap-numbers-lcci/
非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~