哈喽,第一次在掘金上发文章,按以前的习惯是在公众号<易小琳>上发点学习笔记什么的,其实那个号是拿来记录生活的,后边把学习笔记也发在那上面了,我感觉文章内容分布好乱,学习账号也不是,生活分享账号也不是,所以我干脆来掘金上混了,就是一点日常学习笔记,刷题笔记之类的分享。(之前搞过自己的个人博客,在美化博客的时候搞得一塌糊涂,所以就暂时先不搞了)我目前还只是一个普通大二的小姑凉,所以写的文章就很简单且随便,希望我能坚持下去吧。
日期专题
真题 时间显示
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static long h, m, s;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = 46800999;
n /= 1000;// 把毫秒去掉
n %= 86400;// 一天24小时 一小时60分钟 一分钟60秒
h = n / 3600;// 一小时60分钟一分钟60秒 算出来多少小时
n %= 3600;// 还剩多少秒
m = n / 60;// 算出来多少分钟
s = n % 60;// 还剩多少秒
System.out.printf("%02d:%02d:%02d", h, m, s);
}
}
真题 特殊年份
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;// 计数
int[] a = new int[5];
for (int i = 0; i < 5; i++) {
a[i] = scan.nextInt();
int b = a[i] / 1000;// 千位数
int c = a[i] / 100 % 10;// 百位
int d = a[i] / 100 / 10;// 十位数
int f = a[i] % 10;// 个位数
if (b == d && f - c == 1) {
count++;
}
}
System.out.println(count);
}
}
平年:2月是28号
闰年:2月是29号
判断闰年和平年:
(1)不能被100整除并且能被4整除
(2)能被400整除
if(year%100!=0&&year%4==0||year%4==0)
记一下模板吧我也不知道到时候能不能写出来摆烂了
static int d[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
public static boolean check(int date) {
int year = date/10000;
int month = date%10000/100;
int day = date%100;
//保证 N 是一个合法日期的 8 位数表示
if(month ==0|| month>12) return false;
if(day==0||month!=2&&day>d[month]) return false;
if(month==2) {
int leap=0;
//闰年判断
if(year%100!=0&&year%4==0||year%400==0) leap=1;
if(day>28+leap) return false;//闰年 2月29天
}
return true;
}
进制转换
自己去查API文档,索引处搜Integer就能查到所有想要找的。
//十转16
int a = 201314;
System.out.println(Integer.toHexString(a));
// 十转二
System.out.println(Integer.toBinaryString(a));
//十转八
String a = "31262";
System.out.println(Integer.toOctalString(a));
//十六转十
System.out.println(Integer.valueOf(a, 16));
//八转十
System.out.println(Integer.valueOf(a, 8));
//二转十
System.out.println(Integer.valueOf(a, 2));
将字符串转换成字符数组
char s[]=str.toCharArray();
字符数字转换
(char)(‘A’+数字)转换成字符
(int)(‘Z’)转换成数字
(int)(‘Z’-‘A’)转换成数字
真题 山(找回文串个数)
看到题目的回文串需要满足两个要求:
(1)左右对称(回文) (2)数字先单调不减,后单调不增
public class Main {
public static void main(String[] args) {
int cnt = 0;
// 判断区间 [2022, 2022222022] 中有多少个回文串
for (int i = 2022; i <= 2022222022; i++) {
if (check(i))
cnt++;
}
System.out.println(cnt);
}
public static boolean check(long n) {
// 创建字符串
String s = String.valueOf(n);
// 转为字符数组
char[] a = s.toCharArray();
// 判断是否单增不减 后一半就是单减不增
// 判断是否左右对称
for (int i = 0; i < a.length / 2; i++) {
if (a[i] > a[i + 1] || a[i] != a[a.length - 1 - i]) {
return false;
}
}
return true;
}
}
动态规划(DP)专题
参考文章www.acwing.com/blog/conten…
背包区别
0-1背包:i 件物品中,每件物品最多选 1 次
完全背包:i 件物品中,每件物品可以选无限次
多重背包:枚举第 i 件物品选几个
分组背包:枚举第 i 组物品选第几个(哪个)
你定义了什么,从该定义出发。 再是集合的划分 分为几类去处理, 一类是选/不选 一类是类中还细分各种类 属性的确定: max、min、count 前两个max、min是可以允许重合的 最后的答案从定义出发,输出即可。
DP基操: 1.找不同和相同之处/不同和固定之处 2.先把固定/相同的剔除,最后再把他加上 3.从剩下的范围中进行选择方案 4.结合定义出发,输出需要的答案!
0-1背包 看一下之前写的就行 mp.weixin.qq.com/s/M-vTc7KuQ…
再理一遍
package cc.hh;
import java.util.Scanner;
public class Main {
static int n = 1010;// 这个应该是题目给的n的范围
static int f[][] = new int[n][n];
static int w[] = new int[n];// 重量
static int v[] = new int[n];// 价值
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();// 物品数量
int m = scanner.nextInt();// 能装的最大重量
for (int i = 1; i < n; i++) {
w[i] = scanner.nextInt();
v[i] = scanner.nextInt();
}
for (int i = 1; i <= n; i++) {// 遍历物品
for (int j = 1; j <= m; j++) {// 遍历能装的重量
// 当前最大价值等于放上一件的最大价值 就是说当前的重量超过了放不下了只能放上一件更轻一点的
f[i][j] = f[i - 1][j];
// 当前能装的重量大于此时物品的重量 可以放进去或者拿出别的东西再放进去
if (w[i] <= j) {
// 这个物品的价值加上当前能放的总重量减去当前物品重量时(重量为j - w[i])取前i-1个物品时对应重量时的最高价值
// 和不放这个物品的价值
// 相比较
f[i][j] = Math.max(v[i] + f[i - 1][j - w[i]], f[i][j]);
}
}
}
System.out.println(f[n][m]);
}
}
完全背包
for (int i = 1; i <= n; i++) {// 遍历物品
for (int j = 1; j <= m; j++) {// 遍历能装的重量
for (int k = 1; k * w[i] <= j; k++) {
// 当前最大价值等于放上一件的最大价值 就是说当前的重量超过了放不下了只能放上一件更轻一点的
f[i][j] = f[i - 1][j];
// 当前能装的重量大于此时物品的重量 可以放进去或者拿出别的东西再放进去
// 这个物品的价值加上当前能放的总重量减去当前物品重量时(重量为j - w[i])取前i-1个物品时对应重量时的最高价值
// 和不放这个物品的价值
// 相比较
f[i][j] = Math.max(k * v[i] + f[i - 1][j - k * w[i]], f[i][j]);
}
}
}
多重背包
for (int i = 1; i <= n; i++) {// 遍历物品
for (int j = 1; j <= m; j++) {// 遍历能装的重量
for (int k = 1;k<=s[i]; k++) {
// 当前最大价值等于放上一件的最大价值 就是说当前的重量超过了放不下了只能放上一件更轻一点的
f[i][j] = f[i - 1][j];
// 当前能装的重量大于此时物品的重量 可以放进去或者拿出别的东西再放进去
if (k * w[i] <= j) {
// 这个物品的价值加上当前能放的总重量减去当前物品重量时(重量为j - w[i])取前i-1个物品时对应重量时的最高价值
// 和不放这个物品的价值
// 相比较
f[i][j] = Math.max(k * v[i] + f[i - 1][j - k * w[i]], f[i][j]);
}
}
}
}
有点绕不清楚了后面这两个,实在不行就套一下模板能写多少写多少吧其实没多大的改变,就是完全背包不限制数量,多重背包限制数量,完全背包每个物品可选择无限次,多重背包多了1<k<=s[i]的条件,K从0还是1开始看你有没有从0个物品开始遍历吧,我的理解是这样的
真题 线性三角形
这里面好像还涉及到图论的知识点,一脸懵逼。
我前段时间干嘛去了???leetcode没刷多少蓝桥杯也没有好好准备,后端学习进度赶的也是超级慢。。。
不多说了,我相信人一旦被逼疯的情况下学什么都是非常快的。
image
package cc.hh;
import java.util.Scanner;
public class Ma {
static int INF = 0x3f3f3f3f;
static int N = 510;
static int f[][] = new int[N][N];
static int a[][] = new int[N][N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
a[i][j] = sc.nextInt();
}
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= i + 1; j++) {
f[i][j] = -INF;
//先把每个点的距离初始化为-INF
//一般图论问题都是先将点的距离初始化为-INF
}
}
//第1层已初始化
//遍历第2层到第n层的三角形的所有点
//直至最后一层遍历完毕
f[1][1] = a[1][1];
//起点为(1,1),只有一个点,f[1][1]=a[1][1]。
//从第二行开始遍历第一列开始遍历
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
//到达当前点的路径为左上和右上两条路径走过来
//再把当前点的数字加上即可
if (j == 1) {
a[i][1] = a[i][1] + a[i - 1][1];
} else {
f[i][j] = Math.max(f[i - 1][j - 1] + a[i][j], f[i - 1][j] + a[i][j]);
}
}
}
//如果是奇数行 必定是最中间那个数 如果是偶数行 则是中间那两个中较大的数
int res = n % 2 == 1 ? f[n][n / 2] : Math.max(f[n][n / 2], f[n][n / 2 - 1]);
System.out.println(res);
}
}
网上搜的,用就是了。一般图论问题都是先将点的距离初始化为-INF
不知道为什么运行出来的不是27而是28.。。不管了。
再加一个昨天刷的题
真题 货物摆放
import java.util.ArrayList;//ArrayList包不要搞错啊这个事考自己手写的
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
///定义一个数组存放num的因子
//先找出num的因子 每一个位置不一样的
long num =2021041820210418l;//这里右边加l是因为数字太大了要把int转为long型的
ArrayList<Long> arr = new ArrayList<>();
//开根函数Math.sqrt()
for(long i=1; i<=Math.sqrt(num); i++){
if(num%i == 0){//能被整除则是因子
arr.add(i);//放入到数组中
//i能被整除的情况下 就能把另一个因子求出来了
long n = num/i;
if(n!=i){//就是两个因子不同时 就是避免两个都是开方数如num为4的时候 两个都是2 2
//比如num=4 i为1 n为4
//就把n放到数组中
arr.add(n);
}
}
}
//最终因子都放入了arr数组中
int count = 0;//记录方案数
//增强for
//增强for 底层是迭代器 可以理解成简化版本的迭代器iterator遍历
//for(元素类型 元素名 : 集合或数组){ 元素访问 }
//普通for的我总是没搞出来不知道哪里出问题了
for(long i : arr){
for(long j : arr){
for(long k : arr){
if(i*j*k == num)
count++;
}
}
}
System.out.println(count);
}
}
先到这了,能不能水个奖就看运气了,最近没怎么好好准备时间全拿去赶学习进度了。