不占用任何额外空间的情况下交换两个数的值

题目

假如有x、y两个数,如何在不占用任何额外空间的情况下交换两个数的值?

思路

平时我们在交换两个数的值时,往往会用一个中间数temp来实现效果,现在需要不占用任何额外空间,自然就不能使用这种寻常的方法了;这里可以有两种方法来实现。

方法一

int x = 5;
int y = 10;
x = x + y;
y = x - y;
x = x - y;

先将两个数之和附给x,接着x-y自然就是原本x的值,这时候赋值给y,y就拿到了x原本的值。此时x依然是两个数之和,再进行x-y自然就是原本x的值。

这种方法比较直观,也好理解,但是可能存在溢出的情况。

方法二

int x = 5;
int y = 10;
x = x ^ y;
y = x ^ y;
x = x ^ y;

第二种方法利用了异或运算的性质:

  • 相同的两个数异或结果为0
  • 任何数与0异或结果还是其自身
  • 异或运算满足交换律和结合律

于是将x^y的结果赋予x,接着再将x与y异或,此时y的值就是x^y^y = x^(y^y) = x,也就是说y拿到了x原本的值。

此时x依然是两数异或的结果,而y是x原本的值,接着进行x^y就等同于x^y^x = y, 于是x就拿到了y原本的值。

这种方法很巧妙,也不太好理解,但是不存在溢出的情况。

原文地址:https://www.cnblogs.com/yulinlewis/p/10162819.html

时间: 2024-10-16 05:17:39

不占用任何额外空间的情况下交换两个数的值的相关文章

如何在不介入第三个变量的情况下实现两个数的交换

如何在不介入第三个变量的情况下实现两个数的交换: 1 package myeclipseFiles2; 2 3 public class Operator { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 int a=6; 8 int b=1; 9 System.out.println(a+":"+b); 10 11 //方法一:不借助第三个变量完成两个数的交换 1

在不使用第三方参数的情况下交换两个参数的值

//方法一 i = i + j; j = i - j; i = i - j; //方法二 i ^= j; j ^= i; i ^= j; //方法三 a = a + b - (b = a)

python中不引入第三方变量的情况下交换a\b的值

a = 1b = 2a=a+b #a是3b=a-b # b是1a=a-b # a是2print('a:',a)print('b:',b)

如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算

问题:一般我们要交换两个变量的值,多会采取一个额外变量来实现,比如temp=a,a=b,b=temp,现在我们能不利用temp来实现交换a,b两个变量值的目的吗? 解决方案:^异或运算符,而且我们会发现a^a=0,还有0^a=a,依据这两条理论,我们可以实现之前提出的问题. 代码如下: #include<stdio.h>void inplace_swap(int * x,int * y){    *y=*x^*y;    *x=*x^*y;    *y=*y^*x;}int main(){  

在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串

1 import java.util.*; 2 3 public class Reverse { 4 public String reverseString(String iniString) { 5 char []initchar=iniString.toCharArray(); 6 int len=initchar.length; 7 for(int i=0;i<len/2;i++){ 8 char temp=initchar[len-i-1]; 9 initchar[len-i-1]=in

JS如何在不给新空间的情况下给数组去重?

1.先排序,在让相邻元素对比去重 const nums = [3, 1, 1, 5, 2, 3, 4, 3, 5, 5, 6, 4, 6, 6, 6]; Array.prototype.arrayNorepeat = function () { let arr = this; let len = arr.length - 1; let i = 0; //先给数组排序 for (; i < len; ++i) { let j = 0; for (; j < len - i; ++j) { if

excel在不改变格式的情况下,对两个名字的某几个日期下的内容进行替换

1 #-*- coding: UTF-8 -*- 2 import xlrd 3 import sys 4 import locale 5 import os 6 import xlwt 7 from xlutils.copy import copy 8 9 reload(sys) 10 sys.setdefaultencoding( "utf-8" ) 11 homedir=os.getcwd() 12 print u"文件路径",homedir 13 print

在不申请第三方变量的情况下交换a和b

1.算数运算 a=a*b;b=a/b;a=a/b; 2.XOR运算 a和bxor运算两次还是 a 3.栈运算 stack<数据类型>s 4.程序运行 1 #include <iostream> 2 #include<stdlib.h> 3 #include<stack>//STL里重要的函数 4 using namespace std; 5 /*void _stack(int x,int y){ 6 stack<int>s; 7 s.push(x

JS 不声明第三个变量的情况下实现两数变换

1. 1 var a = 1; 2 var b = 2; 3 a = a + b; //3 4 b = a - b; //1 5 a = a - b; //2 6 console.log(a); 7 //2 8 console.log(b); 9 //1 2. var a = 1; var b = 2; a ^= b; b ^= a; a ^= b; console.log(a); //2 console.log(b); //1 console.log((a ^= b) === (a ^ b)