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


内容摘自英雄哥,详情请看英雄哥,以下是java版

一、概念

变量交换

二、模板

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

void swap(int a, int b){  
    a = a + b;        
    b = a - b;        
    a = a - b;        
}

三、例题

题:面试题 16.01. 交换数字

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

示例:

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

提示:

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

解:

解题思路:暴力

AC代码:

class Solution {
    public int[] swapNumbers(int[] numbers) {
        return new int[]{numbers[1], numbers[0]};
    }
}

解题思路:模板

AC代码:

class Solution {
    public int[] swapNumbers(int[] numbers) {
        numbers[0] = numbers[0] + numbers[1];
        numbers[1] = numbers[0] - numbers[1];
        numbers[0] = numbers[0] - numbers[1];
        return numbers;
    }
}

解题思路:位运算

AC代码:

class Solution {
    public int[] swapNumbers(int[] numbers) {
        numbers[0] = numbers[0] ^ numbers[1];
        numbers[1] = numbers[0] ^ numbers[1];
        numbers[0] = numbers[0] ^ numbers[1];
        return numbers;
    }
}

题:面试题 05.07. 配对交换

配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。

示例1:

 输入:num = 2(或者0b10)
 输出 1 (或者 0b01)

示例2:

 输入:num = 3
 输出:3

提示:

num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。

解:

解题思路: num是int范围内的数:

  • 0xaaaaaaaa = 10101010101010101010101010101010 (偶数位为1,奇数位为0)

  • 0x55555555 = 1010101010101010101010101010101 (偶数位为0,奇数位为1)

将奇偶拆开移动再合并

AC代码:

class Solution {
    public int exchangeBits(int num) {
        int odd = num & 0x55555555; // 保留奇数
        int even = num & 0xaaaaaaaa; // 保留偶数
        odd <<= 1; // 奇数左移
        even >>>= 1; // 偶数右移
        return odd | even; // 合并奇偶
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值