蓝桥杯复习备忘录

目录

1.ASCII码与字符转换

2.四舍五入保留整数

3.如何设置保留固定小数位数 

4.闰年判断条件 

 5.如何将一个字符串转换为一个数字?

6.字符串的分割函数

7.日期类 

8.判断五个数不同  五个数范围都是1到9

9.振兴中华(基础动规问题) 

10.获得数x各个位相加的返回值

10.题目细节 

11. 纸牌三角形  牌型种类 煤球数量

12.求最小公倍数 

13.归并排序

14.质数 (素数)

15.分数 

16.跑步锻炼(模拟日期   重要***)

17.大数类的操作

18.数列求和  

 19.k倍区间    子串分值 

20.进制转换 

21.位运算 

22.//1MB=1024KB=1024B,32位二进制整数是4字节,即4B 

23.对数组进行排序

 24.二分法专题

25.时间显示 

 26.printf的输出格式 

27.快速幂 

28.关于大数类 


1.ASCII码与字符转换

采用强转的形式

public static void main(String[] args) {
		System.out.println((int)'A');//65
		System.out.println((int)'a');//97
		System.out.println((char)65);//A
		System.out.println((char)97);//a
		System.out.println('a'-'a');//0
		System.out.println('b'-'a');//1
	}

2.四舍五入保留整数

计算a/b 使其四舍五入保留0位小数,且转换成百分比的形式 例如:99%

1.要将被除数,除数的数据类型改写为double

2.被除数要先乘以100

3.四舍五入要采用Math.round()方法   / 就可以得到0位小数

	double num=sc.nextInt();
		double pass=0;
		double best=0;

		System.out.println(Math.round(pass*100/num)+"%");
		System.out.println(Math.round(best*100/num)+"%");
		

3.如何设置保留固定小数位数 

法一:(47条消息) java保留double类型固定小数位数的方法_欢迎访问胡宝全的博客-CSDN博客

用String类的format方法    且此方法是四舍五入的

double    x = 1.23456789
System.out.println(String.format("%.6f", x));   //表示四舍五入保留六位小数。
System.out.println(String.format("%.3f", x));   //表示四舍五入保留3位小数 输出为1.235

法二:

Math中的round方法  且此方法是四舍五入的

System.out.println((double)Math.round(x*1000)/1000.0); //表示四舍五入保留x小数点后三位小数结果为1.235

4.闰年判断条件 

1,能被4整除,并且(&&)不能被100整除 或者 (||) 2,能被400整除

   if (year % 4 == 0 && year % 100 != 0 ||year % 400 == 0) {

           System.out.println(year + "是闰年!");

       }

 5.如何将一个字符串转换为一个数字?

前提是这个字符串是数字的类型,如“123”;(47条消息) Java中,如何将字符串转为数字(StringToNumber)_isea_you's blog-CSDN博客_java如何将字符串转换为数字

package com.isea.java;
public class Test {
    public static void main(String[] args) {
        String str = "123";
 
        Integer num1 = new Integer(str);
 
        int num2 = Integer.parseInt(str);
 
        Integer num3 = Integer.valueOf(str);
 
        System.out.println(num1 + "\t" + num2 + "\t" + num3);//123	123	123
    }
}

 如果要使用浮点数,可以使用Float.ParseFloat或者是Double.ParseDouble

6.字符串的分割函数

(47条消息) 字符串分割-Java中的String.split()方法_Yui的博客-CSDN博客_java string.split()用字符串分割

在java.lang.String包中有split()方法,该方法的返回值是一个String类型的数组。返回的数组不含有分隔符

split()方法分别有以下两种重载方式:
split(String regex);
split(String regex,int limit);

参数regex :即 regular expression (正则表达式)。这个参数并不是一个简单的分割用的字符,而是一个正则表达式,它对一些特殊的字符可能会出现你预想不到的结果。如果该参数为"",返回值为包含整个字符串的单一元素数组。

参数limit:该值用来限制返回数组中的元素个数(也就是最多分割成几个数组元素,只有为正数时有影响)

1、“.”和“|”作为分隔符时,前面必须得加”\\”;

用“*”或“+”或者“\\”作为分隔符参数,split()方法运行将抛出java.util.regex.PatternSyntaxException异常,也需要在前面加上“\\”进行转义。

String[] strArray = "192.168.0.1".split("\\.");
    //"."作为分隔符时,必须用"\\"进行转义
    for (String str:strArray) {
    System.out.println(str);
}

2、如果在一个字符串中有多个分隔符,可以用“|”作为连字符;

*********改进行转义的越需要进行转义!!!!*******

	public static void main(String[] args) {
		/*
		 * String str=”Java string
			split
			test
		 */
		String[] strArray = "String str=”Java string-split#test".split("-|#");
	    //"."作为分隔符时,必须用"\\"进行转义
	    for (String str:strArray) {
	    System.out.println(str);
		
	}

7.日期类 

有趣的是MONTH字段是从0月开始计数的,所以12月对应的值是11

DAY_OF_WEEK中星期天对应的是1星期一对应的是2星期六对应的是7

而YEAR和DAY_OF_MONTH都是从1开始计数

12月对应11  星期天对应1

详细参考:1.(48条消息) 算法竞赛中的常用JAVA API :Calendar日期类_GD_ONE的博客-CSDN博客

2.尚硅谷ppt

8.判断五个数不同  五个数范围都是1到9

(48条消息) 【蓝桥真题1】这道用了7个for循环的蓝桥真题,让舍友哭着跑出考场【内附原题资源】_执梗的博客-CSDN博客

public class 马虎的算式 {
    public static void main(String[] args) {
        int count=0;
        for (int a = 1; a <= 9; a++) {
            for (int b = 1; b <= 9; b++) { //每次for循环前要判断前面是否有相等元素
                if (a != b) for (int c = 1; c <= 9; c++) {
                    if (b != c && a != c) for (int d = 1; d <= 9; d++) {
                        if (a != d && b != d && c != d) for (int e = 1; e <= 9; e++) {
                            if (a != e && b != e && c != e && d != e) {
                                if ((a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (c * 10 + e)) {
                                        count++;
                                }
                            }
                        }
                    }
                }
            }
        }
        System.out.println(count);//答案为142
    }
}

9.振兴中华(基础动规问题) 

10.获得数x各个位相加的返回值

 采用先取余10获得最低位数  再将该数除10 依次进行

 public static int sum(int x){//获得数x各个位相加的返回值
        int count=0;
        while(x>0){
            count+=x%10;
            x=x/10;
        }
        return count;
    }

10.题目细节 

 蓝桥杯复习备忘录_第1张图片

   首先这个题目有个大坑。看它给的第一个例子,如果按代码中的除来算,8/3应该等于2,952/714等于1,这样最后的答案6+2+1=9,并不等于10。我们代码中在整数类型里的除号并不是严格意义的除号,而是取模,小数部分直接被舍去了的。题目里的要求其实需要我们进行通分,也就是B/C+DEF/GHI进行通分以后整除得到一个数加上A等于10。十个字母对应十种情况,那就是全排列考虑所有可能出现的情况,然后一个个判断是否符合。

所以全排列的时候代码要这么写  先保证 通分后相除是个整数 又要(&&) 保证相加等于10

      (B*GHI+C*DEF)%(C*GHI)==0 && A+(B*GHI+C*DEF)%(C*GHI)==10
 

11. 纸牌三角形  牌型种类 煤球数量

(49条消息) 【蓝桥真题2】蓝桥杯不会全排列,那就只能写10个for循环了【内附近8年真题资源】_执梗的博客-CSDN博客

12.求最小公倍数 

蓝桥杯复习备忘录_第2张图片

13.归并排序

归并排序的所有for区间都是  for (int i = left; i <= right; i++)

14.质数 (素数)

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

	static int isPrime(int num) {
		for (int i = 2; i <= Math.sqrt(num); i++) {
			if(num%i==0)
				return 0;
		}
		return 1;
	}

15.分数 

1/1​+1/2​+1/4​+1/8+⋯

每项是前一项的一半,如果一共有 20 项,求这个和是多少,结果用分数表示出来。

类似:3/2,当然,这只是加了前 2 项而已。分子分母要求互质。

如何满足分子、分母互质呢?我们首先要求除分子、分母的最大公约数,然后分子、分母都除以这个最小公约数即可!

public class Main {

	static int gcd(int a,int b) {
		int temp;
		while(b>0) {
			temp=b;
			b=a%b;
			a=temp;
		}
		return a;
	}
	public static void main(String[] args) {
		int z=1;//分子
		int m=1;//分母
		for (int i = 2; i <= 20; i++) {
			m*=2;
			z+=m;
		}
		
		int t=gcd(z, m);
		z/=t;m/=t;
		System.out.println(z+"/"+m);
		
	}
}

16.跑步锻炼(模拟日期   重要***)


小蓝每天都锻炼身体。

正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(11日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。

小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

进行模拟  也可以采用日期类  但是我自己写的比较麻烦

下面这个模拟特别重要 一定一定要学会!!!!

tips:1.刚上来就day++  所以起始日期是没有进行判断的!!!单独拿出来判断即可!!

2.while的结束条件:    while(y!=2000 || m!=12 || d!=31)   中间用||

结束日期已经在循环体当中进行了判断!!!无需额外判断!!

public class 跑步锻炼 {
	static int[] M={0,31,28,31,30,31,30,31,31,30,31,30,31};
	public static void main(String[] args) {
		int y = 2000, m = 1, d = 1, w = 6, ans = 0;
		while(y!=2020 || m!=10 || d!=1){
			if(y%400==0 || (y%4==0&&y%100!=0)){
				M[2] = 29;
			}
			else{
			    M[2] = 28; //M是全局变量
			}
			d++;
			w = (w + 1) % 7;//w为0为星期天
			if(d > M[m]){
				d = 1;
				m ++; 
			} 
			if(m>12){
				m = 1;
				y ++;
			} 
			if(d==1 || w==1){
				ans++;  //是月初或者周一多加一次 
			}
			ans++;
		}
		//这个循环是先加值再加日期,所以2020.1.10号的已经加上去了,但是2000.1.1没加上,所以加2
		ans+=2;
		System.out.println(ans);//8879
	}
}

17.大数类的操作

 (50条消息) 算法竞赛中的常用JAVA API :大数类_GD_ONE的博客-CSDN博客

18.数列求和  

(50条消息) 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可_执梗的博客-CSDN博客

  这道题的目的并不是要让大家去用什么大数据类型处理,要去分析题意!这个数之大肯定是无法用数字表示的,而题目只要求我们最后4位数字——更加说明所以这道题根本不需要去大数据处理!题目只关心最后四位数字,而前面的数字根部不会影响后面的数字,所以当我们的数字大于4位数时,我们只保留它的后四位即可。这样子可以大大减少时间的消耗提高速度!!

	public static void main(String[] args) {
		int a=1;
		int b=1;
		int c=1;
		int ans=0;
		for (int i = 4; i <= 20190324; i++) {
			ans=a+b+c;
			if(ans>10000)
				ans=ans%10000;
			a=b;
			b=c;
			c=ans;
		}
		System.out.println(ans);
	}


 

 19.k倍区间    子串分值 

K倍区间:

一看到区间的和 就要想到前缀和!!

然后根据记忆同余定理:

蓝桥杯复习备忘录_第3张图片

(50条消息) 【蓝桥真题3】蓝桥改革变难,想进国赛这些能力你可缺一不可_执梗的博客-CSDN博客

子串分值:

     题目分析:这道题是可以暴力做的,可以拿到60分。每次计算以S[i]为字符串的头往后遍历计算可以获得的分数。对于S[i,j]的子数组中只出现一次的元素我们可以通过S[i,j-1]去获得,用不着每次都遍历。这里我用一个Set去记录只出现一次的元素,再用一个Set记录重复出现过的元素(感觉可以优化但是没有去优化)

public class 子串分值 {
	//过了6个得了六十分
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
        String s=sc.next();
        int count=0;
        int n=s.length();  
        for(int i=0;i set1=new HashSet<>();
        	//放多次出现的字符
        	Set set2=new HashSet<>();
        	set1.add(s.charAt(i));
        	for(int j=i+1;j

20.进制转换 

 输出16进制这种存在字母的一定要看题目样例输出是大写还是小写,从调用String类的大小写函数来进行修改。

 低精度的我们可以用

    // 如果题目要进行转化的进制在2~36之间的话直接调用库函数就行了。
	String s = in.readLine();	
    int a = Integer.parseInt(s, 16) // 将16进制的字符串转化十进制数
    //BigInteger a = new BigInteger(s, 16);// 高精度数
    
    out.write(Integer.toString(a, 8));	// 转化为8进制输出
  	//out.write(a.toString(8));
    out.flush();

高精度的可以用          大数类无敌!

public static void main(String[] args) {
	Scanner sc=new Scanner(System.in);
	String str=sc.next();
	BigInteger n=new BigInteger(str,16);//将十六进制转换为10进制
	System.out.println(n.toString(10));//将n以十进制输出

21.位运算 

(49条消息) 算法很美1.1 位运算_我叫lxc的博客-CSDN博客

主要用途如下:

1.判读奇偶  &1   最低位为0则说明该数字为偶数,最低位为1则说明该数字为奇数

2.获取二进数第n位是0还是

   2.1将第n位右移到第一位,然后与1相与即可

public static void main(String[] args) {
	Scanner sc=new Scanner(System.in);
	int n=sc.nextInt();
	int x=sc.nextInt();
	System.out.println(Integer.toString(n, 2));
	if((n&1)==0)
		System.out.println("偶数");
	System.out.print(n+"的第"+x+"位二进制数是");
	System.out.println((n>>(x-1))&1);
			

蓝桥杯复习备忘录_第4张图片

22.//1MB=1024KB=1024B,32位二进制整数是4字节,即4B 

23.对数组进行排序

	Arrays.sort(nums);//对数组进行排序

 24.二分法专题

 第 8 节 三种二分查找模板对比 | 算法吧 (suanfa8.com)

25.时间显示 

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取
了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时
刻经过的毫秒数。
        现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要
显示出时分秒即可,毫秒也不用显示,直接舍去即可。
        给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
 

 这是去年JavaB组省赛的第一道大题,有的人一看到就来一句——卧槽!这么难?从1970年开始那得有多少毫秒?算了算了先看下一题。但是大家要想一下? 题目求的是什么?是今天的时分秒!我们不需要去关心今天是多少年多少月多少日,所以我们有下面的这几步思考步骤:
         设接收到的总毫秒数为n。
         1.首先先n=n/1000。因为n的单位是毫秒,我们需要的最低精准单位是秒,而1s=1000ms,所以不足一秒的毫秒我们直接舍去,此时n的单位变成了秒
        2.进行操作n=n%(60*60*24)。因为我们只关心今天走了的时间,也就是今天走了多少秒,我们对一整天的秒数进行取余,则获得的就是未满一天的秒数,也就是今天的
        3.long hour=n/3600;因为我们已经获得了今天的秒数,1h=3600s,我们算出n可以整除出多少个3600,则就是多少个小时,由此得到了今天的小时数。
        4.n%=3600;long month=n/60;我们先对n%3600是为了得到剩下未满一个小时的秒数,也就是分加上秒的,我们对n取余60,就能得到分钟的值。
        5.n%=60; long s=n;同理于分,先取余60,剩下的n就是我们最后的秒数了。
 

import java.util.Scanner;
 
public class 时间显示 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		long n=sc.nextLong();
		//拿到的是毫秒,先转换为秒,1m等于1000ms
		n=n/1000;
		//现在拿到的是秒,对一天的秒数取余即可获得今天的秒数
		n=n%(60*60*24);
		//现在拿到的是一天的秒数,开始转化为答案,一小时有3600秒,先获得秒
		long hour=n/3600;
		//现在获得分钟加分
		n%=3600;
		//再获得分钟
		long month=n/60;
		//再获得秒
		n%=60;
		long s=n;
		//这里涉及输出格式,大家可以学习一下printf的输出格式
		System.out.printf("%02d:%02d:%02d",hour,month,s);	
	}
}

 26.printf的输出格式 

        System.out.printf("%02d:%02d:%02d",hour,month,s);  

可以将hour   month  s 小于等于10的进行补加前导“0” 

27.快速幂 

//快速幂函数,赋值照用即可
        static long qmi(long a,int k,int p) {
        long res=1;
        while(k>0) {
            //这样判断k的二进制最后一位是否是1
            if((k&1)==1) res=res*a%p;
            k>>=1;
            a=(long)a*a%p;
        }
        return res;
    }    


28.关于大数类 

 b=b.add(a)   才相当于 b++ !!!!!!!!!!!!!!!!

b.intValue ------------------>转换为int类型 注意是否溢出

for (BigInteger b=new BigInteger("1");b.intValue()<=n; b=b.add(a)) {
				if((w.mod(b).intValue())!=0) {
					F=true;
					break;
				}
			}

你可能感兴趣的:(蓝桥杯,java,职场和发展)