首页 > 试题广场 > 无缓存交换
[编程题]无缓存交换
  • 热度指数:7345 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个int数组AB,要求编写一个函数,不使用任何临时变量直接交换第零个元素和第一个元素的值。并返回交换后的数组。

测试样例:
[1,2]
返回:[2,1]
Ron头像 Ron
    public int[] exchangeAB(int[] AB) {
        // write code here
    	AB[0] = AB[0]^AB[1];
    	AB[1] = AB[0]^AB[1];
    	AB[0] = AB[0]^AB[1];
    	return AB;
    }

发表于 2016-06-12 10:58:43 回复(7)
importjava.util.*;
publicclassExchange {
    publicint[] exchangeAB(int[] AB) {
        // write code here
        AB[0]=AB[0]+AB[1];
        AB[1]=AB[0]-AB[1];
        AB[0]=AB[0]-AB[1];
        returnAB;
    }
}
发表于 2015-09-24 22:24:21 回复(2)
public int[] exchange(num[2]){
    num[1] = num[0]^num[1];
    num[0] = num[0]^num[1];
    num[1] = num[0]^num[1];
return num;
}

类似互逆运算可以利用 加减 乘除等实现,但是应该考虑两数的和、积超出int取值范围情况,乘除法应该考虑0的情况。
编辑于 2015-08-13 14:23:06 回复(0)

python 解法,怕是失了智哦。

return [AB[1], AB[0]]
发表于 2017-10-31 17:16:49 回复(2)
位运算

class Exchange {
public:
    vector<int> exchangeAB(vector<int> AB) {
        AB[0] ^= AB[1];
        AB[1] ^= AB[0];
        AB[0] ^= AB[1];
        return AB;
    }
};


运行时间:4ms

占用内存:476k


发表于 2018-12-26 18:47:45 回复(0)
class Exchange {
public:
	vector<int> exchangeAB(vector<int> AB) {
		// write code here
		AB.insert(AB.end(), AB.begin(), AB.end());
		AB.erase(AB.begin());
		AB.erase(AB.end() - 1);
		return AB;
	}
};

发表于 2017-09-04 15:11:53 回复(1)

我的方法还是最low的。。

    public int[] exchangeAB(int[] AB) {
        // write code here
        AB[0] = AB[0] + AB[1];
        AB[1] = AB[0] - AB[1];
        AB[0] = AB[0] - AB[1];
        return AB;
    }
发表于 2017-07-30 22:05:17 回复(1)
class Exchange:
    def exchangeAB(self, AB):
        AB[0], AB[1] = AB[1], AB[0]
        return AB

发表于 2016-12-29 07:27:05 回复(0)
public int[] exchangeAB(int[] AB) {
        // write code here
        //^ 异或运算,相同为0 不同为 1, 
        //AB ={1,2};
        AB[0]=AB[0]^AB[1];//AB[0]=3
        AB[1]=AB[0]^AB[1];//AB[1]=1
        AB[0]=AB[0]^AB[1];//AB[0]=2
        return AB;
    }

发表于 2016-08-29 11:22:40 回复(0)
class Exchange {
public:
    vector<int> exchangeAB(vector<int> AB) {
        // write code here
        //假如AB[0]=3,AB[1]=2
        AB[0]=AB[0]+AB[1];//AB[0]=5,AB[1]=2
        AB[1]=AB[0]-AB[1];//AB[1]=3,AB[0]=5
        AB[0]=AB[0]-AB[1];//AB[0]=2,AB[1]=3
        return AB;
    }
};

发表于 2016-08-18 21:56:06 回复(0)

看不懂...

编辑于 2018-05-23 21:08:03 回复(0)
通过两个计算两个数的和与差来交换a,b的位置
(a,b)----(a+b,b)----(a+b,a-b)------(b,a-b)----(b,a)
import java.util.*;

public class Exchange {
    public int[] exchangeAB(int[] AB) {
        // write code here
        
        AB[0]=AB[0]+AB[1];
        AB[1]=AB[0]-2*AB[1];
        AB[0]=(AB[0]-AB[1])/2;
        AB[1]=AB[0]+AB[1];
        return AB;
        
    }
}

发表于 2016-08-30 09:42:55 回复(0)
class Exchange {
public:
    vector<int> exchangeAB(vector<int> AB) {
        // write code here
        if(AB.size()<2) return {-1,-1};
        if(AB[0]==AB[1]) return AB;
        AB[0]^=AB[1];
        AB[1]^=AB[0];
        AB[0]^=AB[1];
        return AB;
    
    }
    
};

发表于 2021-01-30 14:54:18 回复(0)
例:AB=[7,3]
AB[0]=0111=7
AB[1]=0011=3

AB[0]=AB[0]^AB[1]=0100=4
           0111^0011=0100=4

AB[0]=0100=4
AB[1]=0011=3

AB[1]=AB[0]^AB[1]=0111=7
           0100^0011=0111=7

AB[0]=0100=4
AB[1]=0111=7

AB[0]=AB[0]^AB[1]=0011=3
           0100^0111=0011=3

AB[0]=0011=3
AB[1]=0111=7

import java.util.*;

public class Exchange {
    public int[] exchangeAB(int[] AB) {
        // write code here
        AB[0]=AB[0]^AB[1];
        AB[1]=AB[0]^AB[1];
        AB[0]=AB[0]^AB[1];
        return AB;
    }
}


发表于 2020-10-21 17:20:43 回复(0)
import java.util.*; public class Exchange { public int[] exchangeAB(int[] AB) { AB[0] = AB[0]^AB[1]; AB[1] = AB[0]^AB[1]; AB[0] = AB[0]^AB[1]; return AB; } }
发表于 2020-08-14 16:56:31 回复(0)
class Exchange:
    def exchangeAB(self, AB):
        # write code here
        return AB[::-1]

发表于 2020-08-11 09:46:06 回复(0)
class Exchange {
public:
    vector<int> exchangeAB(vector<int> AB) {
        // write code here
        AB.push_back(0);
        AB[2] = AB[0];
        AB[0] = AB[1];
        AB[1] = AB[2];
        AB.pop_back();
        return AB;
    }
};

发表于 2020-08-03 16:59:57 回复(0)
异或运算:

相同为0 ,不同为1。

发表于 2020-04-09 22:43:24 回复(0)
Java实现,已通过。已知a,b,要求无缓存交换:
a=a+b;
b=a-b;(这样就把 a 的值赋给了 b );
a=a-b;(把b的值赋给a)。
代码如下;
import java.util.*;
public class Exchange {
    public int[] exchangeAB(int[] AB) {
        
        AB[0]=AB[0]+AB[1];
        AB[1]=AB[0]-AB[1];
        AB[0]=AB[0]-AB[1];
        return AB;
        // write code here
    }
}
  还有一个思路,运用异或 ^ 位运算:0^x=x , x^x=0。
  设M、N是常数,a=M,b=N, a=a^b=M^N;
  b=a^b=M^N^N=M^0=M ( 这样把M赋给b )
  a=a^b=M^N^M=0^N=N (把N赋给a)。
  代码如下:
import java.util.*;
public class Exchange {
     public int[] exchangeAB(int[] AB) {
        AB[0]^=AB[1];
        AB[1]^=AB[0];
        AB[0]^=AB[1];
        return AB;
    }
}


编辑于 2020-02-08 11:10:28 回复(0)
class Exchange {
public:
    vector<int> exchangeAB(vector<int> AB) {
        if(AB[0] == AB[1])
        {
            ;
        }
        else
        {
            AB[1] = AB[0] ^ AB[1];
            AB[0] = AB[0] ^ AB[1];
            AB[1] = AB[0] ^ AB[1];
        }
        return AB;
    }
};
这么多发帖的没一个想到要对AB[0]和AB[1]相等时做特判的?还是测试数据太弱了……
编辑于 2020-01-13 20:58:05 回复(0)