首页 > 编程语言 >【小航的算法日记】变量交换算法

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

时间:2022-11-29 10:37:11浏览次数:40  
标签:面试题 小航 int 交换 偶数 算法 num numbers 日记


目录

  • ​​一、概念​​
  • ​​二、模板​​
  • ​​三、例题​​
  • ​​题:面试题 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; // 合并奇偶
}
}


标签:面试题,小航,int,交换,偶数,算法,num,numbers,日记
From: https://blog.51cto.com/u_15895329/5894200

相关文章

  • 【小航的算法日记】线性枚举(二) - 统计法入门
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:1550.存在连续三个奇数的数组​​​​解:​​​​题:1295.统计位数为偶数的数字​​​​解:​​​​题:540.有......
  • 【小航的算法日记】进制转换(二) - 进阶
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:202.快乐数​​​​解:​​​​题:168.Excel表列名称​​​​解:​​​​题:171.Excel表列序号​​​​解:​​......
  • 【小航的算法日记】进制转换(一) - 入门
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:剑指Offer15.二进制中1的个数​​​​解:​​​​题:258.各位相加​​​​解:​​​​题:1290.二进制链表转......
  • 【小航的算法日记】字符串算法(二) - 字符串比较
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:剑指Offer05.替换空格​​​​解:​​​​题:面试题10.05.稀疏数组搜索​​​​解:​​​​题:1763.最长的......
  • 【小航的算法日记】线段树
    本内容取经于:https://leetcode.cn/problems/my-calendar-i/solution/by-lfool-xvpv/一、概念概念区分:线段树解决的是「区间和」的问题,且该「区间」会被修改前缀和解决的是......
  • 【小航的算法日记】字符串
    目录​​一、概念​​​​二、模板​​​​三、例题​​​​题:344.反转字符串​​​​解:​​​​题:541.反转字符串II​​​​解:​​​​题:剑指Offer05.替换空格​​​......
  • 【小航的算法日记】哈希
    一、概念哈希表、哈希函数、哈希碰撞二、模板三、例题题:242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个......
  • 【小航的算法日记】图论
    目录​​一、概念、模板​​​​存图方式:​​​​1.邻接矩阵​​​​2.邻接表​​​​3.类​​​​算法:​​​​拓扑排序:​​​​最短路问题:​​​​1.Floyd「多源汇最短路......
  • 算法面试点汇总
    算法面试点汇总我们会在这里介绍我所涉及到的算法相关的面试点内容,本篇内容持续更新我们会介绍下述算法的相关面试点:二分查找冒泡排序选择排序插入排序快速排序......
  • 【算法训练营day20】LeetCode654. 最大二叉树 LeetCode617. 合并二叉树 LeetCode700.
    LeetCode654.最大二叉树题目链接:654.最大二叉树初次尝试和昨天最后一题的思路很像,本质上都是递归构建二叉树。classSolution{public:TreeNode*constructMa......