蓝桥杯31天冲刺打卡day11

1、卡片

思路:既然是从1开始拼的,那么只需要计算1用完时卡片数字进行到多少了即可。

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。

小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从 1 拼到多少。

例如,当小蓝有 30 张卡片,其中 0 到 9各 3 张,则小蓝可以拼出 1 到 10,

但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。

现在小蓝手里有 0 到 9 的卡片各 2021张,共 20210 张,请问小蓝可以从 1 拼到多少?

提示:建议使用计算机编程解决问题。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
  static int nums = 0;
    public static void main(String[] args) {
        for(int i =1;;i++){
          String str = String.valueOf(i);
          for(int j = 0;j<str.length();j++){
            if(str.charAt(j)=='1'){
              nums++;
              if(nums==2021){
                System.out.println(i);
                return;
              }
            }
          }
          
        }
    }
}

2、路径

填空题,答案:10266837

由于是查找最短路径,所以在这里我使用的是Floyd算法

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。

2,对于每一对顶点 i 和 j,看看是否存在一个顶点 k 使得从 i 到 k 再到 j 比已知的路径更短。如果是更新它。

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。

小蓝的图由 2021 个结点组成,依次编号 1 至 2021。

对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点 之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条 长度为 a 和 b 的最小公倍数的无向边相连。

例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无 向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。

请计算,结点 1 和结点 2021 之间的最短路径长度是多少。

提示:建议使用计算机编程解决问题。

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class 路径 {
     static int [][]floyd = new int[2022][2022];
     static int [][]path = new int[2022][2022];
    public static void main(String[] args) {
        for(int i =1;i<=2021;i++){
          for(int j=i+1;j<=2021&&j-i<=21;j++){
         floyd[i][j]=floyd[j][i]=lcm(i,j);//由于是无向图所以,i与j与j与i的边是一样的
          }
        }
        for(int k=1;k<=2021;k++){
          for(int i=1;i<=2021;i++){
            for(int j=1;j<=2021;j++){
//如果i到k和j到k之间的边为0,即为不存在,那么就没必要更新,如果存在,那么看新路径是否比原来的短,短则更新,当然,如果原来本就不存在,那么肯定要更新
              if(floyd[i][k]!=0&&floyd[j][k]!=0&&(floyd[i][j]==0||floyd[i][k]+floyd[j][k]<floyd[i][j])){
                floyd[i][j]=floyd[i][k]+floyd[k][j];//将最短路径更新
              }
            }
          }
        }
        System.out.println(floyd[1][2021]);
    }
    
    static int lcm(int i ,int j){//求最小公倍数
      return i*j/gcd(i,j);
    }
    static int gcd(int i,int j){//求最大公因数
      return j!=0?gcd(j,i%j):i;
    }
}

3、字符统计

思路:将字符串中的每个字符出现次数单独进行存储,由于都是大写字母,所以可以减去65(A的ASCii值为65)来进行存储。然后将出现次数最多的次数算出来,随后将每个字母出现的次数与之比较,相同即输出其字母。

问题描述

给定一个只包含大写字母的字符串 S, 请你输出其中出现次数最多的字符。

如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。

输入格式

一个只包含大写字母的字符串 S.

输出格式

若干个大写字母,代表答案。

样例输入

BABBACAC

样例输出

AB

评测用例规模与约定

对于 100%100% 的评测用例, 1≤∣S∣≤106.

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class 字符统计 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        String str = scan.next();
        int []s = new int[26];
        for(int i = 0;i<str.length();i++){
          s[str.charAt(i)-65]++;
        }
        int max = 0;
        for(int i=0;i<s.length;i++){
          max = Math.max(max,s[i]);
        }
        for(int i=0;i<s.length;i++){
          if(s[i]==max){
            System.out.print((char)(65+i));
          }
        }
    }
}

4、还不太清楚

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值