《程序员面试金典(第6版)》面试题 16.01. 交换数字(位运算符,异或性质)

题目描述

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

示例:

  • 输入: numbers = [1,2]
  • 输出: [2,1]

提示:

  • numbers.length == 2
  • -2147483647 <= numbers[i] <= 2147483647

解题思路与代码

  • 这道题不让使用额外的变量其实就只剩下了一种做法,那就是使用位运算符。因为使用数学的加法,这道题会溢出。

  • 这道题其实就考察了一个知识,就是位运算符中的异或运算符。

  • 异或运算符具有以下特性:当一个数与另一个数异或两次时,结果仍然是原来的数。

如果对位运算符知识不了解的,请看我的这篇文章:C++位运算符基础知识

具体的代码实现如下:

class Solution {
public:
    vector<int> swapNumbers(vector<int>& numbers) {
        numbers[0] = numbers[0] ^ numbers[1];
        numbers[1] = numbers[0] ^ numbers[1];
        numbers[0] = numbers[0] ^ numbers[1];
        return numbers;
    }
};

《程序员面试金典(第6版)》面试题 16.01. 交换数字(位运算符,异或性质)_第1张图片

复杂度分析

时间复杂度:O(1)
空间复杂度:O(1)

总结

这道题有点未免太简单了,在我看了一样并不是特别的大。就为了考察这么一小个知识点,我觉得这道题不该是中等难度的题吧。

最后的最后,如果你觉得我的这篇文章写的不错的话,请给我一个赞与收藏,关注我,我会继续给大家带来更多更优质的干货内容。

你可能感兴趣的:(算法题解析与个人做题技巧总结,#,面试,职场和发展)