不使用第三个变量完成两个整数的交换,这个面试题大概大家都碰到过。如下是java中的代码:
?
public class Person { public static void main(String[] args) { //利用加减法 int a = 10, b = 5; a = a + b; b = a - b; a = a - b; System.out.println("a=" + a + "\nb=" + b); } }
?
还有另外一种方法,且效率更快:
?
public class Person { public static void main(String[] args) { //利用一个数异或本身等于0和异或运算符合交换率 int a = 10, b = 5; a = a ^ b; b = a ^ b; a = a ^ b; System.out.println("a=" + a + "\nb=" + b); } }
?
当然以上两种的算法对应js中也支持,如下:
?
var a = 11,b = 22; a = a + b; b = a - b; a = a - b; console.log(a+'\n'+b)
?或
var a = 11,b = 22; a = a ^ b; b = a ^ b; a = a ^ b; console.log(a+'\n'+b)
?
但如果两个变量是对象类型,java(强类型)貌似无能为力了。js却可以,实现方式还不少,如下:
?
var a = {name:'jack'},b = {name:'tom'}; a = [a,b]; b = a[0]; a = a[1]; console.log(a.name+'\n'+b.name)
?
或者
?
var a = {name:'jack'},b = {name:'tom'}; a = {a:a,b:b}; b = a.a; a = a.b; console.log(a.name+'\n'+b.name)
?
正是利用js动态类型(弱类型)系统及对象/数组直接量特性。其它强类型则不可以,编译器会提示类型转换错误。
?
资源:http://en.wikipedia.org/wiki/XOR_swap
?
?
?
16 楼
askyuan
2010-04-18
呵呵
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个好
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个好
17 楼
lixinlixin2008
2010-04-18
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个赞
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个赞
18 楼
liwanfeng
2010-04-18
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个我还真是第一次看过!牛!
19 楼
20055294
2010-04-19
学习了,收藏了
20 楼
zhouyrt
2010-04-19
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
学习了,谢谢!
21 楼
zhouyrt
2010-04-19
lifesinger 写道
js 1.6:
var x = 1, y = 2;
[x,y] = [y, x];
这样就可以了。目前 firefox 支持。
var x = 1, y = 2;
[x,y] = [y, x];
这样就可以了。目前 firefox 支持。
谢谢玉伯,学习了!JS从perl,python身上学到了不少,可惜其它浏览器(甚至Chrome)都没有支持。希望这些能写入EMCA262 V6中。
纠正下:应该是js 1.7,https://developer.mozilla.org/cn/New_in_JavaScript_1.7
22 楼
zhao103804
2010-04-19
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个方法不错
23 楼
sunzeshan
2010-04-19
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
头回见,很赞
24 楼
anywhere
2010-04-19
如果是企业开发,这样的面试题目没有水准了,
现在算法已是次要的了,
精力应用在业务逻辑实现上,
已经有相当的算法在网上可以找到,
很多也是open source的,
就连google的搜索算法都是。
现在算法已是次要的了,
精力应用在业务逻辑实现上,
已经有相当的算法在网上可以找到,
很多也是open source的,
就连google的搜索算法都是。
25 楼
goon
2010-04-19
上学时的练习题。。。
26 楼
bingufo
2010-04-20
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
哈哈,果然很简单,我编译通过了.佩服
27 楼
lichong_87
2010-04-20
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个是怎么实现的啊?……Java可以但是在C++下面执行结果不对啊,没有交换啊……
28 楼
jimmy9495
2010-04-20
lichong_87 写道
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个是怎么实现的啊?……Java可以但是在C++下面执行结果不对啊,没有交换啊……
虽然结果是跑出来了,但是对于实现原理是怎样的还不是很清晰,有知道的大虾解释下吧!
29 楼
yangpeihai
2010-04-20
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
写得好,学习一下
30 楼
zhaolaiwei
2010-04-21
hiqrf 写道
lbfhappy 写道
hiblue 写道
x = y+0*(y=x);
这个实际上是有隐含变量的.
这个实际上是有隐含变量的.
你指的隐含变量是哪个?
用来保存0*(y=x)的值,你研究一下编译原理就明白了。
想明白这个表达式的系统编译执行过程?有哪位高人请指点?
31 楼
jslfl
2010-04-21
hiblue 写道
x = y+0*(y=x);
这个实际上是有隐含变量的.
这个实际上是有隐含变量的.
运算顺序的技巧而已,没用到啥隐含变量吧,,
32 楼
zhengtianbing123
2010-04-21
satanest 写道
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
这个方法厉害
这个真的很巧妙!
33 楼
jakend
2010-04-28
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
此方法,针对java 可以,针对c++ 就不行,java引用了第三方变量。
34 楼
l8653668
2010-05-15
jakend 写道
phenix9527 写道
int x = 10;
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
int y = 20;
x = y+0*(y=x);
这个方法比较好,我以前有看到过
此方法,针对java 可以,针对c++ 就不行,java引用了第三方变量。
各位大牛可以解释一下么?还是看不懂...
35 楼
smzd
2010-05-20
[]的引入不算变量?没有名字的变量而已!{}也是一样的