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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小航的算法日记变量交换算法相关的知识,希望对你有一定的参考价值。


目录

  • ​​一、概念​​
  • ​​二、模板​​
  • ​​三、例题​​
  • ​​题:面试题 16.01. 交换数字​​
  • ​​解:​​
  • ​​题:面试题 05.07. 配对交换​​
  • ​​解:​​


内容摘自英雄哥,详情请看英雄哥,以下是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; // 合并奇偶


以上是关于小航的算法日记变量交换算法的主要内容,如果未能解决你的问题,请参考以下文章

小航的算法日记图论

小航的算法日记数组

小航的算法日记素数筛选

小航的算法日记大数计算

小航的算法日记字符串

小航的算法日记素数判定