蓝桥杯备考

题型

10 题

  1. 填空题
  2. 代码题

前三道: 循环

  • for 循环 题目中找得到循环次数
  • while循环 知道循环条件找不到循环次数

同时涉及,集合,字符串等知识点的运用

  • 考察字符串常用函数
    字符串转字符数组,判断结尾
  • 集合考察特性
    list:有序可重复
    set:无序不可重复
    map:key-value键值对

循环

得到循环次数----for

19 java c 1

import java.util.*;

public class Main {

	public static void main(String[] args) {
		int cnt=0;
		for(int i=1;i<=2019;i++)
		{
			//将数字转化为字符串
			String s=i+"";
			//将字符串转化为字符数组 toCharArray()
			char[] cs=s.toCharArray();
			
			for(int k=0;k<cs.length;k++)
			{
				if(cs[k] == '0' || cs[k]=='1' || cs[k] =='2' ||cs[k]=='9')
				{
					cnt+=i;
					break;
				}
			}
			
		}
		System.out.print(cnt);
	}

}

15 Java c 2

// 注意这里选用long类型

public class Main {
/**
 * 一些数字立方的末尾刚好是该数字本身
 * 10^4以内的数字中,这样的数有多少个
 * @param args
 */
	public static void main(String[] args) {
		int cnt=0;
		String a="";
		String b="";
		
		for(long i=1;i<=10000;i++)
		{
			//将数字转化为字符串
			 a=i+"";
			 b=i*i*i+"";
			
			//判断b字符串是否以a结尾
			if(b.endsWith(a))
			{
				cnt++;
			}
			
		}
		
		System.out.println(cnt);


	}

}

得到循环条件----while

19 java c 2

public class Main {
/**
 * 一块矩形材料,每次从中间切最大的矩形,然后继续,求2019*324材料可以
 * 切出来多少个
 * @param args
 */
	public static void main(String[] args) {
		int a = 2019;
		int b = 324;
		
		int cnt=0;
		while(a != b)
		{
			if(a>b)
			{			
				a-=b;
				cnt++;
			}else if(b>a)
			{
				b-=a;
				cnt++;
			}
			
		}
		
		cnt++;
		System.out.print(cnt);
	}

}

18 Java C 1

public class Main {
/**
 * 第一天一元,之后每一天比前一天多两元,请计算第几天sum=108
 * @param args
 */
	public static void main(String[] args) {
		int day = 1;
		int a=1;
		int sum=1;
		
		while(sum<108)
		{
			a+=2;
			sum+=a;
			day++;
		}
		
		System.out.print(day);
	}

}

18 java C 2

注意: d要大于0

public class Main {
/**
 * 
 * @param args
 */
	public static void main(String[] args) {
		
		int n=5;
		while(true)
		{
			if(n%5==1)
			{
				int a=(n-1)/5*4;
				if(a%5==2)
				{
					int b=(a-2)/5*4;
					if(b%5==3)
					{
						int c=(b-3)/5*4;
						if(c%5==4)
						{
							int d=(c-4)/5*4;
							if( d%5 == 0 && d>0)
							{
								break ;
							}
						}
					}
				}
			}
			n++;
		}
		
		System.out.print(n);
	}

}

集合和字符串循环 ---- set

list 有序
set 唯一

19 Java C 3

public class Main {
/**
 * 字符串0100110001010001有多少个非空字串
 * substring(i,j)截取字符串
 * @param args
 */
	public static void main(String[] args) {
		String str="0100110001010001";
		HashSet<Object> set=new HashSet<>();//去重;
		
		for(int i=0;i<str.length();i++)
		{
			for(int j=i;j<str.length();j++)
			{
				//截取字符串
				String s=str.substring(i, j+1);
				set.add(s);
			}
		}
		
		System.out.print(set.size());
	
	}

}

public class Main {
/**
 *一个数字的平方与立方正好把0-9的数字用且只用了一次
 *求这个数
 * @param args
 */
	public static void main(String[] args) {
		int n=1;
		HashSet<Object> set = new HashSet<>();
		
		while(true)
		{
		
			String c=n*n+""+n*n*n;
			
			if(c.length()==10)
			{
				for(int i=0;i<c.length();i++)
				{
					set.add(c.substring(i,i+1));
				}
				
				if(set.size()==10)
				{
					break;
				}else {
					set.clear();
				}
			}
			
				n++;	
		}
		
		System.out.print(n);
	
	}

}

循环求质数

  • 质数 只能被1 和它本身整除 最小的质数是2

19 Java C 4

public class Main {
/**
 *找出第2023个质数
 *求这个数
 * @param args
 */
	public static void main(String[] args) {
		
		ArrayList<Object> arr = new ArrayList<>();
		
		for(int i=2;i<20000;i++)
		{
			int n=0;
			for(int j=2;j<=i/2;j++)
			{
				if(i%j==0)
				{
					n++;
					break;
				}
			}
			
			if(n==0)
			{
				arr.add(i);
			}
		}
		
		System.out.print(arr.get(2022));
	
	}

}

排序与算法

冒泡排序

比较相邻的两个元素,将较大值换到右边

for(int i=0;i<a.length-1;i++)
		{
			for(int j=0;j<a.length-1;j++)
			{
					if(a[j]>a[j+1])
					{
						int c=a[j];
						a[j]=a[j+1];
						a[j+1]=c;
					}
			}
		}

选择排序

从未排序的数据元素里面,选出一个最小的(最大的)与第一个元素交换位置

int begin=0;
		int end=a.length;
		while(begin<end)
		{
			int min=a[begin];//存储数组中的最小值
			int idx=begin;//存储最小值的下标
			
			for(int i=begin;i<end;i++)
			{
				if(min>a[i])
				{
					min=a[i];
					idx=i;
				}
			}
			a[idx]=a[begin];
			a[begin]=min;
			begin++;
			
		}

插入排序


		for(int i=1 ; i<a.length ;i++)
		{
			
				//确定哨兵
				int  k = a[i];
				
				//排好序中的最后一个
				int  j=i-1;
				
				//给哨兵腾位置
				while(j>=0 && a[j]>k)
				{
					a[j+1]=a[j];//排好序的最后一个后移
					j--;//排好序的最后一个前移动
				}
				
				//哨兵插入
				a[j+1]=k;
				
			
		}
		

递归算法 ---- 找规律

函数或者算法直接或者间接的调用本身

20 java c 3

public static void main(String[] args) {
	
		System.out.print(fn(20));
	}
	
	public static int fn(int n)
	{
		if(n==1)
		{
			return 1;
		}
		
		
		return fn(n-1)+(n-1)*4;
	}

辗转相除法 求最大公约数

两个整数的最大公约数 = 较小数与(两数相除)余数的最大公约数

/**
 * 求最大公约数
 * @author DELL
 *
 */

public class Main {
	
	public static void main(String[] args) {

		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
	//循环解法
		if(b>a)
		{
			int c=b;
			b=a;
			a=c;
		}
		//保证a>b
		
		while(b!=0)
		{
			int c=a%b;
			a=b;
			b=c;
			
		}
		
		
		System.out.print("最大公约数是: "+a);
	}
	

}




	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		//递归解法
		
		System.out.print(zz(a,b));
		
	}
	
	
	public static int zz(int a,int b)
	{
		//gcb(a,b)=gcb(b,a%b)
		if(b==0)
		{
			return a;
		}
		
		int c=a%b;
		
		return zz(b,c);
		
		
	}
	

全排列

  • n个元素中取n个元素所有排列组合的情况
  • 求组合:
    n 取 m的所有组合情况
  • 求子集:
    n个元素的所有子集(所有的组合情况)

17 java c 3

在这里插入图片描述

邻里交换法

  • 将数组分为确定部分与非确定部分
  • 在未确定部分种,让每一个数据都有机会与未确定部分的第一位交换,则该位暂时变为确定部分

回溯法

  • 类似枚举的搜索尝试过程,在搜索过程中寻找答案

全排列用试探的方法列举所有的可能

  • 在集合中选出一个元素并标记已用(n种)
  • 在上一步基础上,选出第二个元素标记已用(n-1种可能)
  • 以此类推,直到所有的元素都被使用
package demoTest;

import java.util.*;


public class Main {
	static int num[] = new int[10];//存放数据的数组
	static int count = 0;//符合条件的排列组合个数
	static boolean bool[] = new boolean[10];
	
	public static void main(String[] args) {
		dfs(1);
		System.out.print(count/6);
	}
	
	
	public static void dfs(int step)//初始值为1
	{
		
		if(step == 10)//表示9位数已经赋值完毕,递归的结束
		{
			if(num[1]+num[2]+num[4]+num[6] == num[6]+num[7]+num[8]+num[9] && num[1]+num[2]+num[4]+num[6] == num[1]+num[3]+num[5]+num[9])
			{
				count++;
			}
			return ;
		}
		
		for(int i=1;i<10;i++)
		{
			if(!bool[i])
			{
				bool[i]=true;//放入标记
				num[step] = i;
				step++;
				dfs(step);
				step--;
				bool[i]=false;
			}
		}
		
	}
	

}

注意这里要除以6=3(选择) * 2(镜像)

暴力破解

动态规划 DP

暴力递归

带字典的暴力递归

自顶向下进行

使用全局的 HashMap 数组

package demoTest;

import java.util.*;


public class Main {
	
	/**
	 * 跳30阶台阶需要多少 次
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.print(taijie(40));
		
		
	}
	static Map<Integer,Integer> map=new HashMap<>();
	
	static int taijie(int n)
	{
		if(n ==1 || n ==2)
		{
			return n;
		}
		
		if(map.containsKey(n))
		{
			return map.get(n);
		}else {
			map.put(n, taijie(n-1)+taijie(n-2));
			return map.get(n);
		}
		
	}
	
	
}

自底向上的动态规划

是真的看不出来哪里有动态规划思想

package demoTest;

import java.util.*;


public class Main {
	
	/**
	 * 跳30阶台阶需要多少 次
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.print(taijie(10));
		
		
	}

	static int taijie(int n)
	{
		if(n ==1 || n ==2)
		{
			return n;
		}
		
		int  a=1;
		int b=2;
		int t=0;
		
		for(int i=3;i<=n;i++)
		{
			t=a+b;
			a=b;
			b=t;
		}
		
		return b;
		
	}
	
	
}

BFS

在这里插入图片描述

DFS

二维数组问题

二维数组旋转问题

二维数组的行与列的输出顺序

19 java c 6

在这里插入图片描述

public class Main {
	
	
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();//行数
		int m=sc.nextInt();//列数
		
		
		int[][] arr=new int[n][m];
		
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				arr[i][j]=sc.nextInt();
			}
		}
		
		for(int i=0;i<m;i++)
		{
			for(int j=n-1;j>=0;j--)
			{
				System.out.print(arr[j][i]+" ");
			}
			System.out.println();
		}
		
		
		
	}

	
}

根据规律查询某行某列的数据

20 java c 3

在这里插入图片描述

二维数组存放大量数据

package demoTest;

import java.util.*;


public class Main {
	
	
	public static void main(String[] args) {
		String s ="这是一个大量数据的字符串";
		//去掉字符串中的换行
		String c=s.replaceAll("\r\n", "");
		//将字符串转为字符数组
		char[] cs=s.toCharArray();
		int idx=0;
		//创建二维数组存放
		char[][] a=new char[100][100];
		for(int i=0;i<100;i++)
		{
			for(int j=0;j<100;j++)
			{
				a[i][j] = cs[idx];
				idx++;
				
			}
		}
		int cnt=0;
		
		//从左到右遍历
		for(int i=0;i<100;i++)
		{
			for(int j=0;j<94;j++)
			{
				char[] ss= {a[i][j],a[i][j+1],a[i][j+2]};
				//将字符数组转换为字符串
				String s2=new String(ss);
				//判断两个字符串是否相等
				if(s2.equals("qwe")) {
					cnt++;
				}
				
			}
		}
		
		
	}

	
}

一些题目


//7 的 2020 次方,使用BigInteger
	public static void main(String[] args) {
		BigInteger x=new BigInteger("7");
		BigInteger y=new BigInteger("1921");
		
		BigInteger pow=x.pow(2020);
		BigInteger res=pow.remainder(y);//取余
		
		System.out.print(res);
	
	}




public class demo {
	//解密
	public static void main(String[] args) {

	String m="asdfghjklzxcvbnm";
	String n="mnbvcxzlkjhgfdsa";
	
	
	//加密的字符串
	String x="asdf";
	
	//解密后字符串
	String y="";
	
	//存储解密与加密的映射
	Map<Character,Character> map=new HashMap<>();
	for(int i=0;i<m.length();i++)
	{
		map.put(n.charAt(i),m.charAt(i));
	}
	
	
	for(int i=0;i<x.length();i++)
	{
		char s=map.get(x.charAt(i));
		y+=s;
	}
	
	System.out.print(y);
	}
	
}






public class demo {
	//字符串编码
	//大写字母
	//A->1,B->2......Z->26
	//输入数字序列,输出大写字母字符串(字典序最大的那一个)
	public static void main(String[] args) {
		char[] arr={'3','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S',
				'T','U','V','W','X','Y','Z'};
		
		Scanner sc=new Scanner(System.in);
		String n1=sc.next();
		//将字符串转为字符数组
		char[] cs=n1.toCharArray();
		
		for(int i=0;i<cs.length-1;i++)
		{
			String n2=""+cs[i]+ cs[i+1];
			
			//将字符串转为数字 
			int n3=Integer.parseInt(n2);
			
			if(n3>=10&&n3<=26)
			{
				System.out.print(arr[n3]);
				i++;
			}else {
				String s=""+cs[i];
				int n4=Integer.parseInt(s);
				System.out.print(arr[n4]);
			}
		}
		
	
	
	}
	
}



  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值