IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法练习题(三) -> 正文阅读

[数据结构与算法]算法练习题(三)

1.世纪末的星期–日期问题

java日期时间

import java.util.Calendar;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
	Calendar ca=Calendar.getInstance();//创建一个指定日期的对象
	for(int i=1999;i<100000;i+=100) {//枚举1999之后的世纪
		ca.set(i, 11, 31);//Calendar类对象信息的设置,从0开始,12月是11
		if(ca.get(Calendar.DAY_OF_WEEK)==1){//判断获取的这一天是否是周日,记周日为1,周一为2,以此类推
			System.out.println(i);
			break;
		}
		
	}	
	}
}	

2.马虎的算式

import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		int a,b,c,d,e;
		int ret=0;
		for(a=1;a<=9;a++) {
			for(b=1;b<=9;b++) {
				for(c=1;c<=9;c++) {
					for(d=1;d<=9;d++) {
						for(e=1;e<=9;e++) {
							if(a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e) {//各不相等
								if(((a*10+b)*(c*100+d*10+e))==((a*100+d*10+b)*(c*10+e))){
								ret++;
							}
							}
						}
					}
				}
			}
		}
		System.out.println(ret);
	}
}		

3.振兴中华

import java.util.Calendar;
import java.util.Scanner;

public class Main {
	static int lujing(int x,int y) {
		if(x==3||y==4) {//在第三行上或第四列上就只有一种走法,
			//此时既不能向下走,也不能向右走,递归出口
			return 1;
		}
		return lujing(x+1,y)+lujing(x,y+1);//向下及向右的方法相加
	}
	
	public static void main(String[] args) {
		int res=lujing(0,0);
		System.out.println(res);
	}
}	

4.上台阶


import java.util.Calendar;
import java.util.Scanner;

public class Main {
	
	static int a[]= {0,1,2,1,1,1,1,5,5,4,-1,-1,-2,-3,-1,-9};
	static int mm=0x3f3f3f3f;
	
	static int dfs(int idx,int k) {//idx表示所在位置台阶数,k表示不超过6步
		if(idx==15) {
			return -9;
		}
		if(k==6) {
			return -mm;
		}
		int res=-mm;//表示得分
		for(int i=1;i<=4&&idx+i<=15;i++) {//每次最多4步并且最终位置是小于15,不可能超过15
			res=Math.max(res, dfs(idx+i,k+1));//每走一次步数+1
		}
		return res+a[idx];
	}
	
	public static void main(String[] args) {
		
		System.out.println(dfs(0,0));
	}
}

5.递增三元组

import java.util.Calendar;
import java.util.Scanner;

public class Main {
	
	static int a[]= {2,9,17,4,14,10,25,26,11,14,16,17,14,21,16,27,32,20,26,36};
	public static void main(String[] args) {
			int res=0;
			int n=a.length;
			for(int i=0;i<n-2;i++) {
				for(int j=i+1;j<n-1;j++) {
					for(int k=j+1;k<n;k++) {
						if(a[i]<a[j]&&a[j]<a[k]) {
							res++;
						}
					}
				}
			}
			System.out.println(res);
	}
}	

十三期-模拟题

题1

小蓝的IP地址为 192.168.*.21,其中 * 是一个数字,请问这个数字最大可能是多少 ?
答案:255

题2

如果一个整数 g 能同时整除整数 A 和 B,则称 g 是 A 和 B 的公约数。例如:43 是 86 和 2021 的公约数。
请问在 1(含) 到 2021(含) 中,有多少个数与 2021 存在大于 1 的公约数。请注意 2021 和 2021 有大于 1 的公约数,因此在计算的时候要算一个。
答案:89

import java.util.Scanner;

public class Main {
	//公约数
	static int gcd(int a,int b) {
		return b>0?gcd(b,a%b):a;
	}
	public static void main(String[] args) {
		int res=0;
			for(int i=1;i<=2021;i++) {
				if(gcd(i,2021)>1) {
					res++;
				}
			}
		System.out.println(res);	
	}
}	

题3

如果一个整数 M 同时是整数 A 和 B 的倍数,则称 M 是 A 和 B 的公倍数,公倍数中最小的一个正整数称为最小公倍数。
  例如:2021 和 86 的最小公倍数是 4042.
  请问在 1(含) 到 2021(含) 中,有多少个数与 2021 的最小公倍数是 4042。
答案:3

import java.util.Scanner;

public class Main {
	
	static int gcd(int a,int b) {
		return b>0?gcd(b,a%b):a;
	}
	public static void main(String[] args) {
		int res=0;
			for(int i=1;i<=2021;i++) {//公倍数
				if(i*2021/gcd(i,2021)==4042) {
					res++;
				}
			}
		System.out.println(res);	
	}
}	

题4

10 是一个非常特殊的数,它可以表示成两个非负整数的平方和,10 = 3 * 3 + 1 * 1。
  9 也是同样特殊的数,它可以表示成 9 = 3 * 3 + 0 * 0。
  请问,在 1 到 2021 中有多少个这样的数?
  请注意,有的数有多种表示方法,例如 25 = 5 * 5 + 0 * 0 = 3 * 3 + 4 * 4,在算答案时只算一次。
答案 :1632

import java.util.Scanner;

public class Main {
	
	
	public static void main(String[] args) {
		int res=0;
		for(int i=0;i<=2021;i++) {
			for(int j=0;j<=2021;j++) {
				for(int k=0;k<=2021;k++) {
					if(i*i+j*j==k)res++;
				}
			}
		}
	System.out.println(res);
	}
}

题5

下面是一个2020的矩阵,矩阵中的每个数字是一个1到9之间的数字,请注意显示时去除了分隔符号。
  69859241839387868941
  17615876963131759284
  37347348326627483485
  53671256556167864743
  16121686927432329479
  13547413349962773447
  27979945929848824687
  53776983346838791379
  56493421365365717745
  21924379293872611382
  93919353216243561277
  54296144763969257788
  96233972513794732933
  81443494533129939975
  61171882988877593499
  61216868895721348522
  55485345959294726896
  32124963318242554922
  13593647191934272696
  56436895944919899246
  矩阵中一个子矩阵的值是指子矩阵中所有数值的和。
  请问,矩阵中值最大的一个55的子矩阵的值是多少?
答案: 154


import java.util.Scanner;

public class Main {
	
	static int n=20;
	static int s[][]=new int [n+1][n+1];
	static int res=0;
	static int sum(int i,int j) {//求子矩阵的和
		return s[i][j]-s[i-5][j]-s[i][j-5]+s[i-5][j-5];
	}
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		for(int i=1;i<n;i++) {//这里注意数组越界
			String ss =sc.next();//一行字符串的输入
			for(int j=1;j<n;j++) {
				s[i][j]=ss.charAt(j)-'0';//二维数组的数值输入
				s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];//计算二维前缀和
				//s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+s[i][j];
			}
		}
		for(int i=5;i<n;i++) {//注意5*5的子矩阵,至少5行5列,且i一定不会是最后一行
			for(int j=5;j<=n;j++) {
				res=Math.max(sum(i, j),res);//所有5*5的子矩阵取最大的和
			}
		}
		System.out.println(res);
	}
}	

题6

? 小蓝要写一个网页显示一些商品。

? 商品总共有 t 个,按顺序由 1 到 t 编号,每页显示 a 个,请问第 p 页显示的最小和最大编号是多少?
【输入格式】
? 输入一行包含三个整数 t、a、p,相邻整数之间用一个空格分隔。
【输出格式】
? 输出一行包含两个整数,分别表示最小和最大编号。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int t=sc.nextInt();
		int a=sc.nextInt();
		int p=sc.nextInt();
		int res=(p-1)*a+1;
		System.out.println(res+" "+Math.max(t, a*p));
	}
}	

题7

哈弗曼树求编码长度
https://blog.csdn.net/qq_44867340/article/details/119455799

?题8

给定一个正整数 n,请判断 n 的所有数位上的值是否从左到右是严格递增的。
? 例如:1589 是严格递增的 。
? 再如:1336 不是严格递增的,中间有相同的 3。
? 再如:1598 不是严格递增的。
【输入格式】
? 输入一行包含一个正整数 n。
【输出格式】
? 如果是严格递增的,输出“YES”(全大写),否则输出“NO”(全大写)。
【样例输入】
1589
【样例输出】
YES
【样例输入】
1336
【样例输出】
NO
【评测用例规模与约定】
? 对于所有评测用例,1 <= n <= 1000000000。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.next();
		int cnt=0;
		for(int i=0;i+1<s.length();i++) {
			if((s.charAt(i)-'0')<(s.charAt(i+1)-'0')) {
				cnt++;
			}
		}
		if(cnt==s.length()-1) {
			System.out.println("YES");
		}else {
			System.out.println("NO");
		}
	}
}

题9

有 n 个人要排列成一个 k 行 k 列的方阵,请问 k 最大是多少?
输入格式
  输入一行包含一个整数 n。
输出格式
  输出一行包含一个整数,表示答案。
样例输入
15
样例输出
3
样例输入
81
样例输出
9
评测用例规模与约定
  对于 50% 的评测用例,2 <= n <= 1000。
  对于所有评测用例,2 <= n <= 100000000。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println((int)Math.sqrt(n));
	}
}	

題10

问题描述
一个 1 到 n 的排列被称为半递增序列,是指排列中的奇数位置上的值单调递增,偶数位置上的值也单调递增。
例如:(1, 2, 4, 3, 5, 7, 6, 8, 9) 是一个半递增序列,因为它的奇数位置上的值是 1, 4, 5, 6, 9,单调递增,偶数位置上的值是 2, 3, 7, 8,也是单调递增。
请问,1 到 n 的排列中有多少个半递增序列?
输入格式
输入一行包含一个正整数 n。
输出格式
输出一行包含一个整数,表示答案,答案可能很大,请输出答案除以 1000000007 的余数。
样例输入
5
样例输出
10
样例说明
有以下半递增序列:
 (1, 2, 3, 4, 5)
 (1, 2, 3, 5, 4)
 (1, 2, 4, 3, 5)
(1, 3, 2, 4, 5)
 (1, 3, 2, 5, 4)
 (1, 4, 2, 5, 3)
 (2, 1, 3, 4, 5)
(2, 1, 3, 5, 4)
(2, 1, 4, 3, 5)
(3, 1, 4, 2, 5)
评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 20。
对于所有评测用例,2 <= n <= 1000。

题解:排列组合问题,假设100个数,奇数50个递增,其余50个偶数必定递增且唯一,因为只剩50个数且需要满足递增,齐数与偶数分别传入不同的参数,进行取余计算

import java.util.Scanner;

public class Main {
	static int N = (int) 1e9 + 7;
	static long c(long a, long b) {
		long cnt = 1;
		for (long i = 1, j = a; i <= b; i++, j--) {
			cnt = cnt * (j / i) % N;
		}
		return cnt;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long n = sc.nextLong();
		if (n % 2 == 0) {
			System.out.println(c(n, n / 2));
		} else {
			System.out.println(c(n, (n + 1) / 2));
		}
	}
}

1 秒=1000 毫秒

题11停车时间

【问题描述】
? 小蓝将自己的车停在路边,在同一天将车开走。给定停车时间和开走时间,请问小蓝停了多长时间?
【输入格式】
? 输入两行,第一行包含停车时间,第二行包含开走时间。
? 每个时间的格式为 HH:MM:SS,其中 HH 表示时,值为 0 到 23 的整数,如果小于 10 用 0 补齐两位;MM 和 SS 分别表示分和秒,值为 0 到 59 的整数,小于 10 时用 0 补齐两位。
【输出格式】
? 输出总共停车的时间,格式为 HH:MM:SS。
【样例输入】
08:58:10
17:20:31

【样例输出】
08:22:21


import java.io.*;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader brBufferedReader=new  BufferedReader(new InputStreamReader(System.in));
		
		String string[]= brBufferedReader.readLine().split(":");
		String string2[]=brBufferedReader.readLine().split(":");
		int h1=Integer.parseInt(string[0]);
		int m1=Integer.parseInt(string[1]);
		int s1=Integer.parseInt(string[2]);
		int h2=Integer.parseInt(string2[0]);
		int m2=Integer.parseInt(string2[1]);
		int s2=Integer.parseInt(string2[2]);
		int time=(h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
		System.out.printf("%02d:%02d:%02d\n",time/3600,time%3600/60,time%60);
	}
}

文件大小

十二届蓝桥杯java模拟1

十二届蓝桥杯java模拟2

十二届蓝桥杯java模拟3

十二届蓝桥杯java模拟4

十二期javaB组真题

第六届javaB真题

第七届javaB真题

第八届javaB真题

第九届javaB真题

第十届javaB真题

第十一届第一场真题

第十一届第二场真题

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-09 18:42:57  更:2022-04-09 18:44:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:50:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码