java算法汇总(蓝桥常用-->自总版)(更新中...)

0.(杂)

break和continue + 阶乘 + 权限区别 + BufferedReader + split + Collections + 一/二维数组 + 一/二维差分 + 前缀和 + 与或门

练习+扩展总结

1.递归求n的阶乘

public class other_1 {
	public static long factorial(int n) {
		if(n==0) {
			return 1;
		}else {
			return n*factorial(n-1);
		}
	}
	public static void main(String[] args) {
		for(int i=1;i<=20;i++) {
			System.out.println(i+" "+factorial(i));
		}
	}
}

2.互质

素数(素数判定 , 素数筛 , 唯一分解定理 , 约数定理)

  • 质数
    只能被自身和1整除的数为质数

  • 互质
    常用判断条件 : 最大公约数为1的两个数 互质

  • 求最大公约数

      假设有两个数A,B--->A=B*q+R
      则,我们要求的(A,B)的最大公约数 就变成了 求(B,R)的最大公约数,以此类推
    

在这里插入图片描述

3.例题:奇妙的数字

在这里插入图片描述



import java.util.ArrayList;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) {
		for(int i=1;i<2145;i++) {
			int a=i*i;
			int b=i*i*i;
			String c=a+""+b;
			if(s1(c)) {
				System.out.println(i);
				break;
			}
		}

	}
	public static boolean s1(String c) {
		
		char[] x=c.toCharArray();
		Arrays.sort(x);
		c=String.valueOf(x);
		if(c.equals("0123456789")) {
			return true;
		}
		return false;
	}

}

两个数字拼接

	int a=2349;
	int b=69780;
	String c=a+""+b;
	sout(c);
	//输出结果 : 234969780

String.toCharArray()方法

  • 作用 : 将字符串(String) 转化为 字符数组
    (此题toCharArray()方法的作用是 后面需要对c进行排序,所以需要将c转化为数组形式)

      String s="729 384";
      char[] c=s.toCharArray();
      sout(c);
      //输出结果 : 729 384
    

String.valueOf()方法

  • 作用 : 将其他数据类型转换为String类型

      int a=74982;
      String s=String.valueOf(a);
      System.out.println("a的数据类型:"+getType(a));
      System.out.println("s的数据类型:"+s.getClass().getName());
      
      //对于一些基础数据类型,不能直接获取它的数据类型,可用 以下方法
      public static String getType(Object o) {
      	//通过getClass() ---> java的反射机制 获取数据类型
      	return o.getClass().getName();
      }
      
      //输出结果 : 
      a的数据类型:java.lang.Integer
      s的数据类型:java.lang.String
    

4.例题:美丽的2

在这里插入图片描述

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int count=0;
        for(int i=1;i<=2020;i++){
          String s=i+"";
          if(s.contains("2")){
            count++;
          }
        }
        System.out.println(count);
        scan.close();
    }
}

String.contains()方法

  • 作用 : 判断该String对象中是否包含参数中的字符串

      String s="hello world";
      Boolean  b1=s.contains("ell");		//type=true
      Boolean b2=s.contains("world");		//type=false
    

5.ASCII码—a,A,0的转换

a : 97
A : 65
0 : 48

public class Main{
	public static void main(String[] args) {
//		强制转换	
		System.out.println((char)65);	//A
		System.out.println((char)97);	//a
		System.out.println((int)'a');	//97
		System.out.println((int)'A');	//65
		
//		到 '0'--->0的ASCII码是48
		System.out.println('A'-'0');	//65-48=17
		System.out.println('a'-'0');	//97-48=49
		
	}
}

6.String[] a---->求sum+=(a[p].charAt(q))-‘0’;

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
//        int[][] a = new int[20+2][20+2];
//        for(int i=0;i<20;i++){
//          for(int j=0;j<20;j++){
//            a[i][j] = scan.nextInt();
//          }
//        }
        String[] a = {             
                "69859241839387868941",
                "17615876963131759284",
                "37347348326627483485",
                "53671256556167864743",
                "16121686927432329479",
                "13547413349962773447",
                "27979945929848824687",
                "53776983346838791379",
                "56493421365365717745",
                "21924379293872611382",
                "93919353216243561277",
                "54296144763969257788",
                "96233972513794732933",
                "81443494533129939975",
                "61171882988877593499",
                "61216868895721348522",
                "55485345959294726896",
                "32124963318242554922",
                "13593647191934272696",
                "56436895944919899246"};
        int count = 0;
        for(int i=0;i<=15;i++){
          for(int j=0;j<=15;j++){
            int sum = 0;
            for(int p=i;p<i+5;p++){
              for(int q=j;q<j+5;q++){
            	  sum+=(a[p].charAt(q))-'0';
                
              }
            }
            count = Math.max(count,sum);
          }
        }
        System.out.print(count);
        scan.close();
    }
}

7.复数

a+bi
a是实部,b是虚部
在坐标轴上--->相当于a是x,b是y
  • 加减法
    实部+/-实部 ; 虚部+/-虚部

      (a+bi)+(c+di) = (a+c)+(b+d)i
    
  • 乘除法
    类似于多项式,只不过计算出的 i^2=-1

      (a+bi)(c+di)=(ac-bd)+(bc+ad)i
      
      ac+adi+bci+bdi2,因为i2=-1,所以结果是(ac-bd)+(bc+ad)i
    

BigInteger 大整数类型

常用方法 : 赋值,加减乘除

本题用到的方法----value.Of() ; add() ; subtract()

  • value.Of(参数) : 将 参数 转换成指定的数据类型
BigInteger b = BigInteger.valueOf(283);
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        int a = 42;
        BigInteger f = BigInteger.valueOf(a);
        System.out.println("f:"+f+" "+f.getClass().toString()); //output : f:42 class java.math.BigInteger
//        BigInteger t = 23480;	//不能直接这么写(jdk1.8不支持)
        scan.close();
    }
}

BigInteger的详细讲解

8.二维数组按某一列排序

按第一列排序(Lambada表达式写法–常用) :

Arrays.sort(arrays,(o1,o2)->{
	if(o1[0] == o2[0]){	//如果第一列相同,则按照第二列排序
		return o1[1]-o2[1];
	}
	return o1[0] - o2[0];	//按照第一列排序(升序)
//	return o2[0] - o1[0];	//降序
});

如果不需要上面代码的if条件判断 , 更简洁的写法 :

Arrays.sort(arrays,Comparator.comparingInt(o->o[0]));

9.java中的Scanner 和 IO流

以下内容来自AI:

  • Scanner 更适合简单的用户输入处理,

  • 而 I/O 流则更灵活、功能更强大,适用于更复杂的输入输出操作。

      -  Answer
      在 I/O 流中,最常用的包括以下几种流:
      1. FileInputStream 和 FileOutputStream:用于处理文件输入和输出的字节流。
      2. DataInputStream 和 DataOutputStream:用于读写基本数据类型的字节流。
      3. BufferedInputStream 和 BufferedOutputStream:提供缓冲功能,可以提高读写性能的字节流。
      4. FileReader 和 FileWriter:用于读写字符数据的字符流。
      5. BufferedReader 和 BufferedWriter:提供缓冲功能,可以提高读写性能的字符流。
      这些流在处理文件读写时非常常用,能够满足大部分的输入输出需求。
    

9.1 Scanner

  • 使用Scanner类进行输入

//不同数据类型,使用不同的 nextXXX() 方法

public class Main{
	Scanner scan = new Scanner(System.in); //用于控制台从键盘输入数据
	
	int a = scan.nextInt();
	double b = scan.nextDouble();
	long c = scan.nextLong();
	short d = scan.nextShort();
	
	//字符串的输入
	String s1 = scan.next();
	String s2 = scan.nextLine();
}
- next() 和 nextLine()的区别
	next()是 从缓冲区接受字符 遇到空格后停止
	nextLine()是 从缓冲区接受字符,并且接受空格,遇到换行才停止,并且会自动舍弃换行。

- 简单的说就是:
- next() 遇到空格就停止输入了
- nextLine()是遇到回车停止输入
- 例子如下:
	String s1 = scan.next();	//输入:sjfosiejfo jesofi
	String s2 = scan.nextLine();	//输入:hsefjoieo joefjef
	System.out.println(s1);		//输出:sjfosiejfo
	System.out.println(s2);		//输出:hsefjoieo joefjef
  • hasNext() 方法输入——(目前我还没用过)

//hasNext()方法—>多组输入的时候可以用它

	hasNext() 返回值是bool值
	- 作用:当在缓冲区内扫描到字符时,会返回true,否则会发生阻塞,等待数据输入(不会返回false)
// 每次输入三个数,输入三数之和
	while(scan.hasNext()) {
		int a = scan.nextInt();
		int b = scan.nextInt();
		int c = scan.nextInt();
		int sum = a+b+c;
		System.out.println(sum);
	}

在这里插入图片描述

	//还有
	hasNext()	//判断缓冲区中还有没有数据,有返回true,否则等待输入
	hasNextInt()	//判断输入的是不是int型数据,是 返回true,否则继续扫描缓冲区,或者等待输入
	hasNextDouble()		//判断输入的是不是double型数据,是 返回true,否则继续扫描缓冲区,或者等待输入

9.2 IO流

IO流对文件的操作主要分为字节流和字符流

  • 字符流
    字符流有两个抽象类:Writer和Reader类
    其对应子类FileWriter和FileReader可实现文件的读写操作
    BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率。

BufferedReader和BufferedWriter实现快速输入输出(推荐)

  • BufferedReader

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in);
    

常用方法:
int read() //读取单个字符
int read(char[] cbuf,int off,int len) //将字符读入数组的某一部分
String readLine() //读取一个文本行

String s = in.read();	//读入一个字符 可读入空格回车 但不抛弃回车
String s1 = in.readLine();	//读入一行 可读入空格/回车 但回车会抛弃
String s2[] = in.readLine().Split(" ");	//使用split通过空格分割读入的一行字符串,存在s2中
  • BufferedWriter

常用方法:write()

注意:write()不能直接输出int类型—》会输出对应的ASCII码

10.唯一分解性定理

!!!求n!中5的个数—》其实就是求n中5的个数 !!!
素数(素数判定 , 素数筛 , 唯一分解定理 , 约数定理)

11.集合(ArrayList,HashMap,HashSet)详解+ entrySet的应用

12.货物摆放例题——(求n的所有因子+foreach循环+set集合应用)

货物摆放例题——(求n的所有因子+foreach循环+set集合应用)

13.最大公约数和最下公倍数

  • 辗转相除法求最大公约数
  • 最大公约数一定存在,其最小值为1
  • 当gcd = 1时,则称这些数是互质的
  • 公约数(lcm)一定是最大公约数的约数
//最大公约数(不用在意a和b谁大谁小)
//辗转相除法
public static int gcd(int a,int b){
	if(b == 0) return a;
	return gcd(b,a%b);
}

//最小公倍数---》两数乘积除gcd
public static int lcm(int a,int b,int gcd){
	return (a*b)/gcd;
}

14.dfs和bfs算法

15.String的用法

String的用法

16.贪心

参考文件

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值