首页 > 试题广场 >

无缓存交换

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

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

测试样例:
[1,2]
返回:[2,1]
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;
    }

// AB[0] = AB[0] ^ AB[1]
// AB[1] = AB[0]^ AB[1] = AB[0] ^ AB[1] ^ AB[1] = AB[0] ^ 0 = AB[0]
// AB[0] =AB[0] ^AB[1] = AB[0] ^ AB[1] ^ AB[0] = AB[1]

发表于 2024-11-29 16:43:34 回复(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)
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;
    }
}

发表于 2019-12-12 22:58:59 回复(0)
还是有临时变量的简单😂😂  不符合题目要求 看看就算了
import java.util.*;

public class Exchange {
    public int[] exchangeAB(int[] AB) {
        int temp;
        temp=AB[0];
        AB[0]=AB[1];
        AB[1]=temp;
        return AB;
    }
}
发表于 2019-08-12 22:19:23 回复(0)
可以假想一下AB[0]=3,AB[1]=2,代码会比较好写。
发表于 2018-09-10 09:40:18 回复(0)
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;
    }
}
发表于 2018-05-16 16:08:43 回复(0)
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;
    }
}
发表于 2017-11-18 16:09:38 回复(0)

如果采用位运算来交换两个元素,则最可能使用的是位异或运算。
如果是位与,一个数的0就会覆盖掉另一个数的0或者1,信息丢失。
如果是位或,一个数的1就会覆盖掉另一个数的0或者1.
而采用位异或,1表明两个位置不同,0表示相同。

public class Exchange {
    public int[] exchangeAB(int[] AB) {
        AB[1] = AB[0] ^ AB[1];
        AB[0] = AB[0] ^ AB[1];
        AB[1] = AB[0] ^ AB[1];
        return AB;
    }
}
发表于 2017-08-16 09:09:20 回复(0)
import java.util.*;

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

玩过C的都知道这个吧
发表于 2016-09-08 02:14:42 回复(0)
 import java.util.*;

public class Exchange {
    public int[] exchangeAB(int[] AB) {
        // write code here
        AB[1] = AB[0] + AB[1];
        AB[0] = AB[1] - AB[0];
        AB[1] = AB[1] - AB[0];
        return AB;
    }
}
发表于 2016-08-22 14:37:11 回复(0)