题型
10 题
- 填空题
- 代码题
前三道: 循环
- for 循环 题目中找得到循环次数
- while循环 知道循环条件找不到循环次数
同时涉及,集合,字符串等知识点的运用
- 考察字符串常用函数
字符串转字符数组,判断结尾 - 集合考察特性
list:有序可重复
set:无序不可重复
map:key-value键值对
循环
得到循环次数----for
19 java c 1
java
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类型
java
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
java
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
java
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
java
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
java
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());
}
}
java
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
java
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));
}
}
排序与算法
冒泡排序
比较相邻的两个元素,将较大值换到右边
java
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;
}
}
}
选择排序
从未排序的数据元素里面,选出一个最小的(最大的)与第一个元素交换位置
java
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++;
}
插入排序
java
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
java
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;
}
辗转相除法 求最大公约数
两个整数的最大公约数 = 较小数与(两数相除)余数的最大公约数
java
/**
* 求最大公约数
* @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种可能)
- 以此类推,直到所有的元素都被使用
java
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 数组
java
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);
}
}
}
自底向上的动态规划
是真的看不出来哪里有动态规划思想
java
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

java
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

二维数组存放大量数据
java
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++;
}
}
}
}
}
一些题目
java
//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]);
}
}
}
}