算法学习 - 不申请第三个数交换两个整数的值

交换两个数

正常情况我们需要多申请一个变量来交换两个数的值(假设变量为a, b)。例子如下:

int temp = a;

a = b;

b = temp;

这样子就可以了。但这终究是一种需要申请临时变量的方法,总要去想想临时变量的名字。下面主要介绍两种方法。

直接运算

这种办法简单明了,也是我最喜欢使用的办法,因为即使是浮点型也可以用这种办法,继续假设两个变量是ab

a = a+b;

b = a - b;

a = a - b;

这样就交换了!是不是很简单。一下没懂的可以找个例子去试试。

逻辑运算

这种办法也不难理解,就是需要小小的解释一下,先看解决办法,就是使用逻辑运算符的异或的运算符,符号为^

a = a^b;

b = a^b;

a = a^b;

这样子交换是不是有点不太懂?(PS:假如懂了直接看下一个方法)。其实举个例子就懂了。假设a = 3; b= 2;,然后我们看看把这两个变量都转换为二进制是多少。一个int型是4个字节,32bit,那些0我就不写了,我只写前4个bit好了。

a = a^b;

        a=3 = 0  0  1  1
        b=2 = 0  0  1  0
        ----------------
              0  0  0  1

现在a的二进制就是0001了,十进制呢就是1。现在执行

b = a^b;

        a=1= 0  0  0  1
        b=2= 0  0  1  0
        ---------------
             0  0  1  1

发现了吧,现在b的二进制是0011了,十进制就是3了,然后如此执行,a
= a^b; 之后a就变为2了。

其他方法

其实这里也是大同小异了,就是我们上面是对a b的值进行异或,那么交换的是值,其实我们可以对 a b的地址进行异或,这样就可以直接交换a b的地址了,当然 a b代表的值也就变了。

详细方法我不写了。和上面一样,不过换成地址而已了。

PS:假如有更好的办法,可以评论给我,大家一块学习。

时间: 2024-08-02 23:08:19

算法学习 - 不申请第三个数交换两个整数的值的相关文章

使用指针交换两个整数的值

#include<stdio.h>void change_1(int a, int b);void change_2(int *a, int *b); int main(){ int a = 10; int b = 20; printf("changed before:"); printf("a=%d\tb=%d\n", a, b); change_1(a,b); printf("changed 1 affter:"); printf

三种交换两个整数的方法

交换 int a, int b 1.最弱的方法 1 void swap(int &a,int &b) 2 { 3 int c = a; 4 a = b; 5 b = c; 6 } 2.不用另外开辟空间的方法 1 void swap(int &a,int &b) 2 { 3 a=a+b; 4 b=a-b; 5 a=a-b; 6 } 3.高效的位操作 1 void swap(int &a,int &b) 2 { 3 a=a ^b; 4 b =a^ b; //(=

交换两个整数的三种方法

package com.zby.bubble; /** * <class description> 三种方法交换两个整数的值 * * @author zby * */ public class Exchange { public static void main(String[] args) { splitLine(); exchange1(Integer.MAX_VALUE, Integer.MAX_VALUE - 1); exchange1(99, 100); exchange1(Inte

PHP中不用第三个变量交换两个变量的值

相信大家在PHP面试或者学习中经常会遇到这个问题就是“不用第三个变量来交换两个变量的值”,今天正对这个问题来讨论一下: 第一种方法:首先会想到的 这种方法简单可行,顺利的交换了两个变量的值. 第二种方法呢,稍加思考我们就会用到PHP中的函数来实现 第三种方法呢,我们来采用PHP中提供各种字符串分割函数来实现. 简单的题目不同的思想就会有不同的解法,期待更多的答案.

交换两个变量的值,不使用第三个变量(两种方法)

//交换两个变量的值,不使用第三个变量. //有两种解法, 一种用算术算法, 一种用^(异或) //异或:相同为0,不同为1.相当于减法. #include <stdio.h> int main() { int a = 8; int b = 9; printf("初始状态:a = %d, b = %d\n",a,b); a = a + b; b = a - b; a = a - b; printf("算数交换:a = %d, b = %d\n",a,b)

【编程题】不引入第三个变量,而交换两个变量的值

不引入第三个变量,而交换两个变量的值 方法一:算术运算 1 int a,b; 2 a=10;b=12; 3 a=b-a; //a=2;b=12 4 b=b-a; //a=2;b=10 5 a=a+b; //a=12;b=10 它的原理:把a,b看做数轴上的两个点. 第一句"a=b-a"求出了ab两点之间的距离,并且将其保存在a中: 第二句"b=b-a"求出了a到原点的距离(b到原点的距离减去ab两点距离),并且将其保存在b中: 第三句"a=b+a"

PHP不用第三变量交换2个变量的值的解决方法

以前做过一道php面试题是这样的:不使用第三个变量实现交换两个变量的值.一般都是借助第三个中间变量来实现原来两个变量的值交换,但是这道题却要求不能使用中间变量,这对于初学者来说也算是一个难题了.网上找到的几种方法总结如下: 复制代码 代码如下: //字符串版本 结合使用substr,strlen两个方法实现 $a="a";$b="b";echo '交换前 $a:'.$a.',$b:'.$b.'<br />';$a.=$b;$b=substr($a,0,(

python学习笔记(八)函数return多个值,列表推导式和交换两个变量的值

函数return多个值: 补充知识点:写代码得到时候少用全局变量: 1.不安全 2.会一直占着内存不释放 函数多个return值,那么会把这几个return的值都放在一个元组里面,然后返回 1 def hello(a,b,c,d): 2 return a,b,c,d 3 res=hello('ybq','ede','rfv','deq') 4 print(res)#('ybq', 'ede', 'dede', 'deq') 列表推导式: 1 #列表推导式 2 nums=[0,1,3,4,5,6,

交换两个变量的值的三种实现方式

交换两个变量的值的方式: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>交换两个变量的值的方式</title> </head> <body> <script> //第一种方式:使用第三方的变量进行交换 var num1 = 11; var num2 = 12; //把