📢📢📢哈喽大家好,又见面了,时间过得真快啊,转眼间活动的三分之一已经过去了,前几天的文章太水了,原因是得了甲流一直不舒服,每天都感觉困困的,效率很低,唉不说了,大家注意身体奥。
🌈🌈🌈卡片🌈🌈🌈
📋问题描述

❓思路分享
🌈题目大意就是说用0-9的卡片来从1开始拼数字,问每张卡片2021张,能拼到几。
🌈那我们想一下,在这个过程中,哪个数字被用到次数最多,就是哪个数字最先被消耗完?没错,由于没有前导0,最先被消耗完的应该是卡片1。
🌈那么我们只需要统计数位为1的数量,需要用第2022个卡片1的数字减去1便是答案。
📗参考代码
/**
* @ClassName 卡牌你
* @Author @浅夜
* @Date 2023/3/14 19:34
* @Version 1.0
*/
public class Main {
public static void main(String[] args) {
int ans = 0; //统计1的数量
for (int i = 1; ; i++) {
int t = i;
while (t != 0) {
if (t % 10 == 1) ans++;
t /= 10;
}
if (ans == 2022) {
System.out.println(i-1);
break;
}
}
}
}

🍍🍍🍍路径🍍🍍🍍
📋问题描述

❓思路分享(来自怂佬)
🍍对于某个点,它可以通过它之前的21个点获得,我们需要得到到达该点最小值,则对其取最小值即可,最小公倍数用模板来求。另外,1与任何数的最小公倍数为该数本身,那么我们只需要从22开始到2021,每一次对能到达位置的值取最小即可
📗参考代码
import java.io.*;
import java.util.Arrays;
/**
* @ClassName 路径
* @Author @浅夜
* @Date 2023/3/14 20:08
* @Version 1.0
*/
public class 路径 {
public static void main(String[] args) throws Exception {
int[] a = new int[2022];
Arrays.fill(a, Integer.MAX_VALUE); //要求最小,给每一个都放最大
for (int i = 1; i <= 22; i++) a[i] = i; //1与其他数的最小公倍数还是1
for (int i = 22; i <= 2021; i++) {
for (int j = 1; j <= 21; j++) {
a[i] = Math.min(a[i], a[i - j] + lcm(i, i - j));
}
}
System.out.println(a[2021]);
}
//最大公约数
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
//最小公倍数
static int lcm(int a, int b) {
return a / gcd(a, b) * b;//最小公倍数=两数之积÷两数最大公约数
}
}

🍑🍑🍑字符统计🍑🍑🍑
📋问题描述

❓思路分享
🍑我们开一个长度为26 的数组来保存26个大写字母分别出现的次数,其次就是统计出现次数的时候用到的小技巧就是那个字符减去’A‘就会得到一个数字,这个数字就是该字符对应它在数组中的下标,A->0,Z->25。
🍑其次,题目还要求我们字母要按照字典序输出,我们该如何处理呢?
🍑其实用一个集合来按照出现次数保存并输出字母就可以,我们遍历保存字母出现次数的数组,维护一次最大出现次数到集合中,如果碰到了更大的,就将集合清空,将更大的放入,如果碰到跟最大出现次数一样大的,就添到集合当中,这样我们就达到了按照字典序排序的目的。
📗参考代码
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* @ClassName 字符统计
* @Author @浅夜
* @Date 2023/3/14 20:57
* @Version 1.0
*/
public class 字符统计 {
static int[] a = new int[26];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] s = sc.nextLine().toCharArray();
for(int i = 0;i<s.length;i++){
a[s[i]-'A']++;
}
List<Integer> list = new ArrayList<>();
int max = 0;
for(int i = 0; i < 26;i++){
if(a[i]>max) {
list.clear();
max = a[i];
list.add(i);
}else if(a[i] == max) list.add(i);
}
for(int i : list){
System.out.print((char)(i + 'A'));
}
}
}
🌽🌽🌽费用报销🌽🌽🌽
01背包变种问题,01背包还没学,等学完了来补这道题哈哈,今天就先分享这么多啦,打卡去啦,时间越来紧张啦,要加油刷啦!✊