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

Posted 二当家的白帽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法面试题 16.01. 交换数字(java / c / c++ / python / go / rust)相关的知识,希望对你有一定的参考价值。



面试题 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://le-yi.blog.csdn.net/ 博客原创~


以上是关于算法面试题 16.01. 交换数字(java / c / c++ / python / go / rust)的主要内容,如果未能解决你的问题,请参考以下文章

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

小航的算法日记变量交换算法

面试题 16.01. 交换数字-----位运算

leetcode每日一题---面试题 16.01. 交换数字(妙用异或关键字)

剑指Offer面试题29(java版):数组中出现次数超过一半的数字

经典C语言面试算法题