Java算法技巧整理
输入单个字符char
//java里没有nextchar(),这里的意思是字符串里的第一个元素
char ch = scanner.next().charAt(0);
四舍五入保留小数
//四舍五入保留两位小数
String result = String.format("%.2f", a);
仿照C语言%.f的方式控制输出的小数位数
System.out.printf("%.1f",a);
不用中间变量交换两个数
a=b-a;
b=b-a;
a=b+a;
try catch finally题目数据导致 InputMismatchException
例题https://blog.csdn.net/qq_43594119/article/details/104782404点我传送
在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行(这里的意思是你一个try后面跟了好多catch,本题里只跟了一个catch),而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句。
.equals()比较String类型的值是否相等要使用,不要用==
例题https://blog.csdn.net/qq_43594119/article/details/104782436点我传送
import java.util.Scanner;
/**
* @author yinglongwu
*/
public class Main {
public static void main(String[] args) {
int n = 120;
String s = Integer.toString(n); //int转String
System.out.println(s); //输出120
System.out.println(s.substring(s.length()-1)); //输出0
System.out.println(s.substring(s.length()-1)=="0"); //输出false
System.out.println(s.substring(s.length()-1).equals("0")); //输出true
}
}
同样的比较两个对象的值是否相等也是用.equals()
equals()和==的区别
==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
==指引用是否相同, equals()指的是值是否相同
参考博客https://blog.csdn.net/qq_36522306/article/details/80550210点我传送
普通for循环和增强for循环foreach的使用
java的两种for循环
//普通for循环,数组推荐使用,效率更高
for (int i = 0; i < arr.length; i++) {
}
//增强for循环foreach
for (int i : arr) {
}
循环ArrayList时,普通for循环比foreach循环花费的时间要少一点;
循环LinkList时,普通for循环比foreach循环花费的时间要多很多。
需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。
需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。
参考博客:https://blog.csdn.net/weixin_33446857/article/details/86611279
Arrays.sort(arr)排序
//默认升序排序,该排序算法是一个经过调优的快速排序法
Arrays.sort(arr); //参数为数组名
想要降序排序可以通过倒序输出实现或自定义规则
幂函数Math.pow()
//原型 public static double pow(double a, double b)
Math.pow(a,b); //a的b次方。注意返回值是duble类型,a和b可以传int进去
灵活运用BigInteger类型
BigInteger类里提供了大量方法可以求最大公约数、素数、最大最小值等。
可以使用BigInteger.valueOf()方法把其他类型转换为BigInteger
//BigInteger.valueOf()使用演示
int a = 10;
BigInteger b = BigInteger.valueOf(a);
求最大公约数
利用BigInteger里的a.gcd(b)方法求a和b的最大公约数
Scanner scanner = new Scanner(System.in);
BigInteger x = scanner.nextBigInteger();//可以接收int类型
BigInteger y = scanner.nextBigInteger();//也可以利用BigInteger.valueOf()将其他类型转换为BigInteger类型
BigInteger gcd = x.gcd(y); //BigInteger自带的求最大公约数的方法
//BigInteger.valueOf()使用演示
int a = 10;
BigInteger b = BigInteger.valueOf(a);
其他方法
详见博客点我传送https://blog.csdn.net/qq_43594119/article/details/104974770
求最小公倍数
利用公式
a × b = a和b的最大公约数 × a和b的最小公倍数
public static int lcm (BigInteger a,BigInteger b) {
//BigInteger自带的求最大公约数的方法
//intValue();BigInteger类自带转为int型的方法
int gcd = (a.gcd(b)).intValue();
int x = a.intValue();
int y = b.intValue();
int lcm = (x*y)/gcd;//最大公约数×最小公倍数=原来两个数的乘积
return lcm;
}
判断质数
分解质因数
字符串反转、判断回文数
利用StringBuffer类,使用其reverse方法反转,然后再类型转换
点我传送
进制转换
十进制转二进制
使用Integer自带方法
int n = 5;
String result = Integer.toBinaryString(n);
其他方法 点我传送
二进制转十进制
使用Integer自带的方法
String n2 = scanner.next();
int n10 = Integer.parseInt("",2);
其他方法 点我传送
求约数的个数
/**
* @author yinglongwu
*/
//求约数的个数
public static int numberOfDivisors(int n) {
int count = 0;
for (int i = 1; i <= Math.sqrt(n); i++) {
if (n%i==0) {
if (n/i!=i) {
count = count+2;
}else {
count = count+1;
}
}
}
return count;
}
字符串大小写转换
注意:原字符串内容不会改变,返回的内容是改变后的,需要接收
大写转小写
String s = scanner.next();
s = s.toLowerCase();//原字符串内容不会改变,返回的内容是改变后的,需要接收
小写转大写
String s = scanner.next();
s = s.toUpperCase();//原字符串内容不会改变,返回的内容是改变后的,需要接收
首字母大写,其余小写
String s = scanner.next();
s = s.substring(0, 1).toUpperCase()+s.substring(1).toLowerCase();