Java算法技巧整理(还有一些遇到的坑)

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();

不定时更新中…

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

影龙武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值