每日一刷——1.20——准备蓝桥杯

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网


题目一

请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。

比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。

输入描述:

输入共1行,为两个正整数L和R,之间用一个空格隔开。

输出描述:

输出共1行,表示数字2出现的次数。

示例1

输入

2 22

输出

6

示例2

输入

2 100

输出

20   

 Java代码展示:

import java.util.Scanner;public class Main{public static void main(String[] args){int a=0,b=0,num=0;Scanner in =new Scanner(System.in);//这个是循环读取a =in.nextInt();b =in.nextInt();for(int i=a;i<=b;i++){int temp =i;while(temp!=0){int j=temp%10;if(j==2){num++;}temp/=10;}}System.out.println(num);}
}

注意:

在 Java 中,变量 i 是 for 循环的迭代变量,它在循环的每次迭代中都会被更新。如果在 while 循环中直接使用 i 而不创建 temp 变量,会出现以下问题:

当我们在 while 循环中修改 i 的值(通过 temp /= 10),这会影响 for 循环的迭代过程。因为 i 不仅是 while 循环的控制变量,也是 for 循环的迭代变量,修改 i 会导致 for 循环的迭代逻辑出现错误。

例如,假设 i 的初始值是 123,在 while 循环中你将 i 不断除以 10 来检查其每一位数字是否为 2。第一次 while 循环结束后,i 的值就变成了 12,而不是 for 循环期望的下一个迭代值 124。这会导致 for 循环的迭代顺序被破坏,最终结果错误。

为了避免这种情况,我们应该引入了 temp 变量,将 i 的值复制给 temp,然后在 while 循环中对 temp 进行操作,这样就不会影响 for 循环的迭代过程。

题目二

题目描述:B-日历中的数字_牛客竞赛语法入门班函数与递归习题

只通过了测试样例的代码。。。

// 日中包含的   月中包含的   年中包含的// 数字x在这个月的日期里出现了多少次。//闰年
import java.util.Scanner;public class Main{public static void main(String[] args){Scanner in =new Scanner(System.in);while(in.hasNextInt()){int count=0;int q=0;int year =in.nextInt();int month =in.nextInt();int num =in.nextInt();while(year!=0){if(year%10 ==num){q++;}year/=10;}int[] date={31,28,31,30,31,30,31,31,30,31,30,31};count+=q*date[month-1];int temp1=month;while(temp1!=0){if(temp1%10==num){if(temp1==2){count+=date[month-1];//判断闰年代码if((year % 4 == 0 && year % 100!= 0) || year % 400 == 0){count+=1;}}else{count+=date[month-1];}}temp1/=10;}for(int i=1;i<=date[month-1];i++){int temp=i;while(temp!=0){if(temp%10==num){count++;}temp/=10;}}if(num==0){count+=9;if(month<10){count+=date[month-1];}}System.out.println(count);}}
}

正确代码展示:

import java.util.Scanner;public class Main {public static void main(String[] args) {// 创建一个 Scanner 对象,用于从标准输入读取数据Scanner sc = new Scanner(System.in);// 定义一个数组 arr 存储每个月的天数,2 月初始化为 28 天int[] arr = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 进入一个循环,只要输入流还有数据,就会一直执行while (sc.hasNext()) {// 创建一个 StringBuilder 对象,用于存储日期字符串StringBuilder sb = new StringBuilder();// 从输入读取年份 yint y = sc.nextInt();// 从输入读取月份 mint m = sc.nextInt();// 从输入读取一个字符 xchar x = sc.next().charAt(0);// 判断是否为闰年,如果是闰年将 2 月的天数修改为 29 天,否则为 28 天if (y % 400 == 0 || (y % 4 == 0 && y % 100!= 0)) {arr[1] = 29;} else {arr[1] = 28;}// 循环遍历该月的每一天for (int i = 1; i <= arr[m - 1]; i++) {// 使用 String.format 方法将年份、月份和日期组合成一个字符串,格式为 yyyymmdd// %04d 表示年份为 4 位数字,不足 4 位在前面补 0// %02d 表示月份和日期为 2 位数字,不足 2 位在前面补 0String date = String.format("%04d%02d%02d", y, m, i);// 将生成的日期字符串添加到 StringBuilder 中sb.append(date);}// 计数器,用于统计字符 x 出现的次数int count = 0;// 遍历 StringBuilder 中的每个字符for (int i = 0; i < sb.length(); i++) {// 如果字符等于输入的字符 x,计数器加 1if (sb.charAt(i) == x) {count++;}}// 输出字符 x 在所有日期字符串中出现的次数System.out.println(count);}}
}

代码实现逻辑分析:

  1. 导入包和类的定义

    • import java.util.Scanner;:导入 Scanner 类,用于从标准输入读取数据。

    • public class Main:定义一个名为 Main 的公共类。

    • public static void main(String[] args):程序的入口点。

  2. 变量和对象的初始化

    • Scanner sc = new Scanner(System.in);:创建一个 Scanner 对象,用于读取用户输入。

    • int[] arr = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};:存储每个月的天数,初始时 2 月为 28 天。

  3. 输入处理和闰年判断

    • while (sc.hasNext()):只要输入流还有数据,就会执行以下操作。

    • StringBuilder sb = new StringBuilder();:创建一个 StringBuilder 对象,用于存储组合的日期字符串。

    • int y = sc.nextInt();:从输入读取年份。

    • int m = sc.nextInt();:从输入读取月份。

    • char x = sc.next().charAt(0);:从输入读取一个字符。

    • 对输入的年份 y 进行闰年判断,如果是闰年(能被 400 整除或能被 4 整除但不能被 100 整除),将 arr[1](2 月的天数)设置为 29 天,否则为 28 天。

  4. 日期字符串的生成和存储

    • for (int i = 1; i <= arr[m - 1]; i++):遍历该月的每一天。

    • String date = String.format("%04d%02d%02d", y, m, i);:将年份、月份和日期格式化为 yyyymmdd 的字符串。

    • sb.append(date);:将生成的日期字符串添加到 StringBuilder 中。

  5. 字符计数

    • int count = 0;:初始化一个计数器,用于统计字符 x 的出现次数。

    • for (int i = 0; i < sb.length(); i++):遍历 StringBuilder 中的字符。

    • if (sb.charAt(i) == x):如果字符等于输入的字符 x,计数器加 1。

  6. 结果输出

    • System.out.println(count);:输出字符 x 在存储的日期字符串中出现的次数。

使用说明:

  • 运行程序后,程序会不断等待用户输入。

  • 每次输入的格式应该是:年份 月份 字符,例如 2024 2 a

  • 程序会将输入的年份、月份和该月的日期按照 yyyymmdd 的格式组合成一个字符串,存储在 StringBuilder 中。

  • 程序会根据输入的年份判断是否为闰年,并更新 2 月的天数。

  • 最后程序会统计输入的字符在存储的日期字符串中出现的次数并输出结果。

        这个程序的主要目的是统计用户输入的字符在该年该月的日期字符串中出现的次数。例如,输入 2024 2 a,程序会将 2024 年 2 月的日期 20240201 到 20240229 组合成一个字符串,然后统计字符 a 在这个字符串中出现的次数。

错误原因分析 :

        就是感觉自己写代码并没有利用到计算机的精髓,甚至认为计算机实现比大脑自己想还要复杂,就感觉怪怪的,自己写一堆代码,麻烦的判断是不是闰年,如果年有这个数字怎么办?月有这个数字怎么办?就感觉计算机并没有帮到任何忙,只是把我的人脑思考的思路实现了。

知识点对应函数的学习:

  • sc.next().charAt(0)
  • sc.next() 用于读取输入的下一个字符串,而 charAt(0) 是 String 类的方法,用于获取该字符串的第一个字符。例如,char x = sc.next().charAt(0); 这一行先读取一个字符串,然后取其第一个字符存储在 x 中。

  • String.format()
  • 这是 String 类的一个静态方法,用于格式化字符串。在代码中 String date = String.format("%04d%02d%02d", y, m, i); 它将 y(年份)、m(月份)和 i(日期)按照 %04d%02d%02d 的格式组合成一个新的字符串。%04d 表示将整数格式化为 4 位数字,不足 4 位在前面补零,%02d 表示将整数格式化为 2 位数字,不足 2 位在前面补零

  • StringBuilder用法
一、创建 StringBuilder 对象
StringBuilder sb = new StringBuilder();

        上述代码创建了一个空的 StringBuilder 对象。StringBuilder 类提供了一种可变的字符串序列,允许对字符串进行动态操作,与 String 类不同,String 对象是不可变的,一旦创建,其内容不能修改,而 StringBuilder 可以在原有的基础上添加、插入、删除和替换字符。

二、添加内容到 StringBuilder

1、append() 方法:

sb.append("Hello");
sb.append(" ");
sb.append("World");

        这个方法可以将各种数据类型(如 Stringcharintdouble 等)添加到 StringBuilder 对象的末尾。在我的代码中:

for (int i = 1; i <= arr[m - 1]; i++) {String date = String.format("%04d%02d%02d", y, m, i);sb.append(date);
}

        通过 append 方法将格式化后的日期字符串添加到 sb 中,最终形成一个包含该月所有日期的长字符串。

三、插入内容到 StringBuilder

1、insert() 方法:

sb.insert(5, " there");

        此方法可以在 StringBuilder 的指定位置插入内容。例如,上述代码将在索引为 5 的位置插入 " there",如果 sb 原本存储 "Hello World",操作后会变成 "Hello there World"

四、删除内容

1、delete() 方法:

sb.delete(5, 11);

        这个方法可以删除 StringBuilder 中从起始索引到结束索引(不包括结束索引)的字符。例如,在上述插入操作后,使用 delete 方法会将 " there" 删除,sb 会变回 "Hello World"

2、deleteCharAt() 方法:

sb.deleteCharAt(5);

        该方法会删除 StringBuilder 中指定索引处的字符。

五、替换内容

1、replace() 方法:

​​

sb.replace(0, 5, "Hi");

        此方法将从起始索引到结束索引(不包括结束索引)的内容替换为新的字符串。上述代码将把 "Hello" 替换为 "Hi",如果 sb 存储 "Hello World",操作后会变成 "Hi World"

六、反转 StringBuilder 内容

reverse() 方法:

sb.reverse();

该方法会将 StringBuilder 中的字符序列进行反转。例如,如果 sb 存储 "Hello World",操作后会变成 "dlroW olleH"

七、转换为 String

toString() 方法:

String result = sb.toString();

这个方法将 StringBuilder 的内容转换为 String 类型,在需要将 StringBuilder 的内容作为字符串使用时,通常使用这个方法。

八、其他有用的方法

1、length() 方法:

int len = sb.length();

​​        该方法返回 StringBuilder 中字符序列的长度。

2、charAt() 方法:

char c = sb.charAt(0);

        此方法返回 StringBuilder 中指定索引处的字符。

        在原代码中,使用 StringBuilder 的目的是将一个月的所有日期按照 yyyymmdd 的格式拼接成一个长字符串,以便后续统计某个字符的出现次数。通过循环将日期添加到 StringBuilder 中,避免了多次字符串拼接造成的性能开销(因为每次使用 String 拼接都会创建新的 String 对象,而 StringBuilder 只在原对象上操作)。

import java.util.Scanner;public class StringBuilderExample {public static void main(String[] args) {StringBuilder sb = new StringBuilder();// 添加字符串sb.append("I");sb.append(" love");sb.append(" Java");// 插入字符串sb.insert(2, " really ");// 删除字符串sb.delete(2, 9);// 替换字符串sb.replace(0, 1, "We");// 反转字符串sb.reverse();// 输出最终结果System.out.println(sb.toString());}
}

        在上述示例中,我们展示了 StringBuilder 的多种操作。首先添加 "I love Java",然后在索引 2 处插入 " really ",再删除 " really ",接着将 "I" 替换为 "We",最后将整个字符串反转。

        使用 StringBuilder 可以提高字符串操作的效率,特别是在需要频繁修改字符串内容的情况下,避免了 String 的不可变特性带来的性能问题。同时,StringBuilder 提供了丰富的方法,可以方便地对字符串进行各种修改和操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/893307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会议签到系统的架构和实现

会议签到系统的架构和实现 摘要:通过定制安卓会议机开机APP呈现签到界面&#xff0c;并且通过W/B结构采集管理签到信息&#xff0c;实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持&#xff1b;使用SocketIo处理适时消息&#xff1b;使用Flask进行原型开…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

OSS使用签名URL上传(返回前端上传地址)- NodeJS

使用过程 使用PUT方式的签名URL上传文件的过程如下&#xff1a; 代码示例 文件拥有者生成PUT方法的签名URL const OSS require("ali-oss");// 获取签名URL const client await new OSS({accessKeyId: yourAccessKeyId,accessKeySecret: yourAccessKeySecret,buc…

使用 div 自定义 input 和 textarea

1. 为什么要自定义呢&#xff1f; 原生的 input 和 textarea 在某些特定场景下存在功能或兼容性限制&#xff0c;因此使用 div 元素自定义实现&#xff0c;突破原生输入框在样式、功能、兼容性上的限制。 1、解决火狐浏览器换行问题 某些版本的火狐浏览器中&#xff0c;原生…

Golang的网络编程安全

Golang的网络编程安全 一、Golang网络编程的基本概念 作为一种现代化的编程语言&#xff0c;具有优秀的并发特性和网络编程能力。在Golang中&#xff0c;网络编程是非常常见的需求&#xff0c;可以用于开发各种类型的网络应用&#xff0c;比如Web服务、API服务、消息队列等。Go…

Python新春烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

vscode 设置

一、如何在vscode中设置放大缩小代码 1.1.文件—首选项——设置 1.2.在搜索框里输入“Font Ligatures”&#xff0c;然后点击"在settings.json中编辑" 1.3.在setting中&#xff08;"editor.fontLigatures":前&#xff09;添加如下代码 "editor.mous…

航电系统路线规划克隆核心技术!

一、航电系统 航电系统&#xff08;Avionics System&#xff09;是民用飞机的“大脑”与“神经”&#xff0c;分为航电核心处理与数据传感两个部分。航电核心处理系统采用综合模块化、开放式系统结构&#xff0c;为飞机提供公共计算、网络通信和接口、飞行管理、显示与告警、机…

OSCP - Proving Grounds - BullyBox

主要知识点 如果发现有域名&#xff0c;则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件&#xff0c;避免漏掉信息.git dump 具体步骤 执行nmap 扫描&#xff0c;发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…

【计算机网络】传输层协议TCP与UDP

传输层 传输层位于OSI七层网络模型的第四层&#xff0c;主要负责端到端通信&#xff0c;可靠性保障&#xff08;TCP&#xff09;&#xff0c;流量控制(TCP)&#xff0c;拥塞控制(TCP)&#xff0c;数据分段与分组&#xff0c;多路复用与解复用等&#xff0c;通过TCP与UDP协议实现…

MongoDB 备份与恢复综述

目录 一、基本概述 二、逻辑备份 1、全量备份 2、增量备份 3、恢复 三、物理备份 1、cp/tar/fsync 2、WiredTiger 热备份 3、恢复 四、快照备份 一、基本概述 MongoDB 是一种流行的 NoSQL 数据库&#xff0c;它使用文档存储数据&#xff0c;支持丰富的查询语言和索引…

5. 马科维茨资产组合模型+AI金融智能体(qwen-max)+政策信息优化方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…

后端开发基础——JavaWeb(Servlet)

Servlet 关于系统架构 系统架构包括什么形式&#xff1f; C/S架构 B/S架构 C/S架构&#xff1f; Client / Server&#xff08;客户端 / 服务器&#xff09; C/S架构的软件或者说系统有哪些呢&#xff1f; QQ&#xff08;先去腾讯官网下载一个QQ软件&#xff0c;几十MB&…

Hanlp的学习

参考&#xff1a;HanLP 自然语言处理使用总结-CSDN博客 参考&#xff1a;Sprint Boot 工程中HanLP配置相对路径&#xff0c;始终有问题的解决方案_springboot hanlp-CSDN博客 <!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifa…

LLMs(大型语言模型)的多智能体:Auto-GPT

LLMs(大型语言模型)的多智能体:Auto-GPT 是指在一个系统中集成多个具有不同能力、角色和任务的智能体,这些智能体能够相互协作、沟通和交互,以共同完成复杂的任务或解决复杂的问题。每个智能体都可以被视为一个独立的实体,具有自己的策略、目标和知识库,通过相互之间的…

JSON全解析:语法、转换与FastJson应用指南

大家好&#xff0c;我是袁庭新。JSON是一种轻量级、基于文本、开放式的数据交换格式。在数据交换的世界里&#xff0c;JSON 扮演着重要角色。它究竟为何备受青睐&#xff1f;下面就为您详细解读其奥秘与应用。 1.JSON简述 JSON&#xff08;JavaScript Object Notation&#…

Java模拟路由协议-rip(路由器仿真实验)

前言&#xff1a; 好久不见&#xff0c;有段时间没有写文章了&#xff0c;本篇文章&#xff0c;由Blue我带大家来复现rip协议。我们以 b站湖南教师匠所讲rip的视频中的例子为我这篇文章所模拟的路由路径 如图&#xff1a; 模拟路径 视频&#xff1a;http://【深入浅出计算机网络…

吴恩达深度学习——神经网络介绍

文章内容来自BV11H4y1F7uH&#xff0c;仅为个人学习所用。 文章目录 什么是神经网络引入神经网络神经元激活函数ReLU隐藏单元 用神经网络进行监督学习监督学习与无监督学习举例 什么是神经网络 引入 已经有六个房子的数据集&#xff0c;横轴为房子大小&#xff0c;纵轴为房子…

ChatGPT 摘要,以 ESS 作为你的私有数据存储

作者&#xff1a;来自 Elastic Ryan_Earle 本教程介绍如何设置 Elasticsearch 网络爬虫&#xff0c;将网站索引到 Elasticsearch 中&#xff0c;然后利用 ChatGPT 使用我们的私人数据来总结对其提出的问题。 Python 脚本的 Github Repo&#xff1a;https://github.com/Gunner…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…