面试题 16.01. 交换数字(java / c / c++ / python / go / rust)

192 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」。


面试题 16.01. 交换数字:

编写一个函数,不用临时变量,直接交换numbers = [a, b]ab的值。

样例 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://juejin.cn/user/2771185768884824/posts 博客原创~