当前位置: 首页 > 科技观察

八种方法(实现两个号码互换),绝绝!

时间:2023-03-14 16:48:09 科技观察

实现两个数交换的八种方法基本数据类型贪心借助第三个变量包;/*作者:祥林创建时间:2020/9/1522:48文件:XX.javaIDE:IntelliJIDEA*/importjava.效用。随机;publicclassExchange1{publicstaticvoidmain(String[]args){/***随机生成两个固定的0-100之间的整数序列,*其中101表示生成的数字范围在:[0-101)*/Randomrandom=newRandom(47);inta=random.nextInt(101);intb=random.nextInt(101);System.out.println("交换前:a="+a+",b="+b);/***使用第三个变量交换第三个数*/intt=a;//t==aa=b;//a==bb=t;//b==t==aSystem.out.println("交换后:a="+a+",b="+b);}}控制台输出如下:有不懂的朋友可以自己准备三个杯子,和一个空杯子代表变量t,将两个杯子装满水分别代表变量a和b,然后交换a和b两个杯子里的水来理解。不要用第三个变量包来贪心;/*作者:祥林创建时间:2020/9/1522:51文件:cccc.javaIDE:IntelliJIDEA*/importjava.util.Random;publicclassExchange2{publicstaticvoidmain(String[]args){/***随机生成两个固定的0-100之间的整数序列,*其中101表示生成的数字范围在:[0-101)*/Randomrandom=newRandom(48);inta=random.nextInt(101);intb=random.nextInt(101);System.out.println("交换前:a="+a+",b="+b);a=a+b;//a==a+bb=a-b;//b==a+b-b==a,此时b==aa=a-b;//a==a+b-a==b,此时a==bSystem.out.println("Afterexchange:a="+a+",b="+b);}}控制台输出如下:通过乘除运算,两个数交换包贪心;/*作者:祥林创建时间:2020/9/1522:54文件:xxx.javaIDE:IntelliJIDEA*/importjava.util.Random;publicclassExchange3{publicstaticvoidmain(String[]args){/***随机生成两个固定的0-100之间的整数序列,*其中101代表生成数的范围区间为:[0-101)*/Randomrandom=newRandom(50);inta=random.nextInt(101);intb=random.nextInt(101);System.out.println("交换前:a="+a+",b="+b);a=a*b;//此时a==a*bb=a/b;//b==a*b/b==a,此时b==aa=a/b;//a==a*b/a==b,此时a==bSystem.out.println("交换后:a="+a+",b="+b);}}输出:使用赋值运算符,因为这两个方法是作者后来添加的,所以第七和第八个方法通过赋值和加减法放在两个数的前面。包贪心;/*作者:XiangLin创建时间:2020/9/1522:58文件:xx.javaIDE:IntelliJIDEA*/publicclassExchange7{publicstaticvoidmain(String[]args){/***随机生成两个0-100之间的整数,*其中Math.random()会生成[0-1)之间的任意数量的double类型*所以101表示生成的数字范围在:[0-101)*/inta=(int)(Math.random()*101);intb=(int)(Math.random()*101);System.out.println("交换前:a="+a+",b="+b);a=b+a-(b=a);//a==b+a-a==b,a==bSystem.out.println("交换后:a="+a+",b="+b);}}控制台输出如下:使用赋值和乘法实现两个数的交换包贪心;/*Author:XiangLinCreated:2020/9/1523:00File:xxx.javaIDE:IntelliJIDEA*/publicclassExchange8{publicstaticvoidmain(String[]args){/***随机生成0-100之间的两个整数,*Math.random()会生成[0-1)之间任意double类型的数*所以101表示生成数的范围在:[0-101)*/inta=(int)(Math.random()*101);intb=(int)(Math.random()*101);System.out.println("交换前:a="+a+",b="+b);a=b+(b=a)*0;//a==b+a*0==b,a==bSystem.out.println("Afterexchange:a="+a+",b="+b);}}控制台输出如下:XOR在介绍第四种方法之前,首先要跟着大让我介绍一下Java中的“异或”运算符(^)。异或运算符是Java中的一种按位运算符,那么什么是按位运算符呢?按位运算符用于运算整数基本数据类型二进制位中的单个“位”(bit)。我们都知道计算机使用二进制计数而不是十进制计数。也就是说,电脑里没有所谓的2、3、4、5……100……1000……,电脑里只有0和1。按位运算符对两个参数中对应的位进行布尔代数运算,即二进制表示的两个参数对应的0或1,最后产生一个结果。当然,在Java中,我们一般很少用到位运算符,而我们最先接触到位运算符,大概是从C语言或者数字逻辑和电路。实际上,按位运算符是从C语言的低级运算中派生出来的,这些运算符往往需要直接操作硬件来设置硬件寄存器中的二进制位。Java的初衷是嵌入到电视机顶盒中,所以保留了这种面向底层的操作。Java技术三大版本之一:JavaME,Java平台微型版,用于嵌入式开发,用于开发数字机顶盒、可视电话等电子设备。了解了按位运算符的概念之后,再了解一下a^b等“异或”运算。如果a和b的值不同,则异或结果为1;如果a和b的两个数相同,则异或结果为0。如果想记,可以记住六字真言:相同为0,不同为1。或者懂OR运算的朋友也可以从字面上理解,如果两个数不同(要么0和1,要么1和0),则进行OR运算;如果两个数字相同(均为0,或均为1),则结果为0。如果还是有点抽象,没关系,直接上传代码:packagegreedy;/*作者:祥林创建时间:2020/9/1523:05文件:xxx.javaIDE:IntelliJIDEA*/publicclassTest{publicstaticvoidmain(String[]args){/***以二进制形式输出结果*/System.out.println("二进制3:"+Integer.toBinaryString(3));System.out.println("4的二进制:"+Integer.toBinaryString(4));System.out.println("3^3二进制:"+Integer.toBinaryString(3^3));System.out.print("3^0二进制:"+Integer.toBinaryString(3^0));if(3==(3^0))System.out.println(",即十进制3");System.out.print("4^3^3二进制:"+Integer.toBinaryString(4^3^3));if(4==(4^3^3))System.out.println(",即十进制4");}}输出:好戏开始,两个数通过异或运算贪婪地交换包;/*作者:祥林创建时间:2020/9/1523:08文件:xx.javaIDE:IntelliJIDEA*/importjava.util.Random;publicclassExchange4{publicstaticvoidmain(String[]args){/***随机生成两个固定的0-100之间的整数序列,*其中101表示生成的数字范围在:[0-101)*/Randomrandom=newRandom(51);inta=random.nextInt(101);intb=random.nextInt(101);System.out.println("交换前:a="+a+"t;,b="+b);a=a^b;//此时a==a^bb=a^b;//b==a^b^b==a,此时b==aa=a^b;//a==a^b^a==b,此时a==bSystem.out.println("交换后:a="+a+",b="+b);}}Output:Referencedatatype四种方法我想你已经学会了,对两个数的交换信心满满,接下来看一道面试题:packagegreed;/*作者:XiangLin创建:2020/9/1523:10File:xx.javaIDE:IntelliJIDEA*/publicclassExchange5{publicstaticvoidmain(String[]args){Integera=10;Integerb=20;swop(a,b);//打印结果:a=20,b=10System.out.println("a="+a+",b="+b);}privatestaticvoidswop(Integera,Integerb){//这里完成代码}}如代码所示,完成代码处指定位置,这样程序最终运行结果为:a=20,b=10。你可能觉得这不简单,然后“刷”一下完成的代码可能如下:privatestaticvoidswop(Integera,Integerb){a=a^b;b=a^b;a=a^b;}然后看输出的时候傻眼了:纳尼,不变?为什么是这样?如果你想知道为什么,你可能需要自己了解Java内存模型。毕竟Java里面没有C语言。指针(小声bb)当然,本博主以后也可能会发这方面的博客。让我来揭晓正确答案吧!privatestaticvoidswop(Integera,Integerb)throwsNoSuchFieldException,IllegalAccessException{//在此处完成代码//a=a^b;//b=a^b;//a=a^b;intx=a;inty=b;//使用反射操作IntegerClassc=Integer.class;Fieldfield=c.getDeclaredField("value");//授权访问privatefield.setAccessible(true);//设置a的值,b设置为的值y和x分别是field.setInt(a,y);field.setInt(b,x);}当当当当,控制台输出如下:想了解反射的朋友可以关注我的博客哦!毕竟,反射是我学习JavaSE知识时最惊奇和最喜欢的三个知识之一。至于第六种方法:privatestaticvoidswop(Integera,Integerb){System.out.println("a="+b+",b="+a);//终止Java虚拟机System.exit(0)的运行;}哈哈,别打我,我就试试这个。。。毕竟标题只是说了,所以运行结果是:a=20,b=10(^_?)☆纯属巧合要么是命中注定,要么是一个人在偷偷努力。结尾!作者:顾缺月原文链接:http://nxw.so/44cPJ本文转载自微信公众号“50分钱程序员”,可通过以下二维码关注。转载本文请联系程序员公众号,50美分。

最新推荐
猜你喜欢