敢不敢说你全部能看懂?

宏Lee 2012-08-01 11:01:32
关于整形(int)不使用中间变量相信大家有常用的算法,比如
1最常用的:
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a^b;
b = b^a;
a = a^b;
System.out.print(a + ":" + b);
}
这个是最快的

其次不是很好但是可行的
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a+b;
b = a-b;
a = a-b;
System.out.print(a + ":" + b);
}和
public static void main(String[] args) {
int a = 5;
int b = 4;
a = a * b;
b = a / b;
a = a / b;
System.out.print(a + ":" + b);
}
这2种可能会内存溢出,不建议使用

最后一种,可能大家没看过的,可能是最难理解的:
public static void main(String[] args) {
int a = 5;
int b = 4;
b = a + 0 * (a = b);
System.out.print(a + ":" + b);
}
...全文
2798 87 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
87 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiars123 2012-09-17
  • 打赏
  • 举报
回复
最后一种没见过,和第一种比较一下,哪种好?
风行傲天 2012-08-07
  • 打赏
  • 举报
回复
全是交换,不是很难
meichen8050753 2012-08-07
  • 打赏
  • 举报
回复
这个不是算法。只是方法、
WuQingYouOK 2012-08-07
  • 打赏
  • 举报
回复
最后一种可能有些问题,得要看编译器,b = a + 0 * (a = b);这个语句编译器它有可能从右到左执行,当然也有可能从左到右(因为编译器会做些一些优化,加法交换律允许加号两边的式子交换,要是编译器把这个语句优化成b=0*(a=b)+a;然后从左到右执行,你这个就错了。)实际应用真的不大,最好别用。
说真的,讨论这些就是浪费时间,交换变量就可以用个中间变量,不会耽误多少时间(现在的电脑还是能够承担起的,要是怕开销太大,干脆你以后就只用C/C++吧,其他语言本身开销很大),建议新手别看这种无聊贴,浪费时间,把时间放在语言的精髓。(还有要说的就是,上面有些人学的什么编程啊,还见都没见过,连个16的人都比不过,说实话,我只16岁)
_还行_ 2012-08-07
  • 打赏
  • 举报
回复
第一种方法,C语言里用得较多。
陌隋 2012-08-07
  • 打赏
  • 举报
回复
java中常看到的是第二种。最后一种真没看到过。
anhuixiaozi 2012-08-06
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 的回复:]

还纠结呢?javap -c ,看一下指令就好了。
Java code

Code:
0: iconst_5 //栈(底-->顶):5
1: istore_1 //5存进变量1
2: iconst_4 //栈(底-->顶):4
3: istore_2 //4存进变量2
4: iload_1 //5拿到顶 栈(底-->顶):5
……
[/Quote]

有意思
小败 2012-08-06
  • 打赏
  • 举报
回复
楼主的想法很不错。
qiuqiupeng 2012-08-06
  • 打赏
  • 举报
回复
从运算符的优先级及作用域来理解,最好有点编译原理的思想就不难理解了
sxcong 2012-08-06
  • 打赏
  • 举报
回复
这个有c的基础都好理解,还好,一般理工科大学都学c。
顺便问一个算法题,假设有个链表,(vector,map,array等),里面有几百万条记录,每记录是一个class对象,其中有一个变量是int. 假设已知某记录的该变量的值,var=1024. 用什么方法能快速找出这条记录,算法复杂度大约是多少?

leasystu 2012-08-06
  • 打赏
  • 举报
回复
没意思。还不如去看 acm 的题目
朗晴 2012-08-06
  • 打赏
  • 举报
回复
很有趣。
我老公出差了 2012-08-05
  • 打赏
  • 举报
回复
一看就懂
ankle 2012-08-04
  • 打赏
  • 举报
回复
真巧啊~~~
  • 打赏
  • 举报
回复
中国人学习语言就像学习英语一样,喜欢死抠这种没什么实际用途的东西
_john_ 2012-08-04
  • 打赏
  • 举报
回复
这是取决于编译器的。
fsp970219 2012-08-04
  • 打赏
  • 举报
回复
unspecified behavior
b = a + 0 * (a = b);
没有一个语言规定b必须在a=b之前求值呀
如果编译器优化的时候改变求值顺序,结果就变了

a=b;
b=a+0*a;
这样就不对了
huimie2012 2012-08-04
  • 打赏
  • 举报
回复
同花顺面试的时候考过,不借助辅助空间交换两个数值。
老紫竹 2012-08-03
  • 打赏
  • 举报
回复
果断选择第一个
zoeg 2012-08-03
  • 打赏
  • 举报
回复
谁要是在我的项目里写出这样的代码:
b = a + 0 * (a = b);
果断抓去当典型批斗!
加载更多回复(62)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧