【蓝桥杯】快读|min和max值的设置|小明和完美序列|​顺子日期​|星期计算|山

news2024/11/20 3:24:02

目录

一、输入的三种方式

1.最常见的Scanner的输入方法

2.数据多的时候常用BufferedReader快读

3.较麻烦的StreamTokenizer快读(用的不多)

StreamTokenizer常见错误:

二、min和max值的设置

 三、妮妮的翻转游戏

四、小明和完美序列

五、顺子日期(填空题)

六、星期计算(填空题)

七、山


推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

 


一、输入的三种方式

1.最常见的Scanner的输入方法

Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
System.out.print(n+" "+m);

2.数据多的时候常用BufferedReader快读

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strings = br.readLine().split(" ");
int n = Integer.parseInt(strings[0]);
int m = Integer.parseInt(strings[1]);
System.out.print(n+" "+m);

3.较麻烦的StreamTokenizer快读(用的不多

对于读取字符类型的操作,只能读取26个字母,特殊符号和数字无法读取,有其局限性

因为他使用起来比较麻烦,所以可以封装一个对象,减少代码量

//封装的对象
static class Read {
		StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		public int nextInt() throws Exception {
			st.nextToken();//读取数据
			return (int)st.nval;//默认存储的是double类型
		}
		public String readLine() throws Exception {//有局限,慎用
			st.nextToken();
			return st.sval;
		}
	}

public static void main(String[] args) throws Exception {
    Read read = new Read();
	int n = read.nextInt();
	System.out.print(n);
}

StreamTokenizer常见错误:

(1)StreamTokenizer读入long类型的数字时会出现错误

因为nval的类型是double,在转换为long类型的过程中,double类型能表示的数字范围比long大,但是是以牺牲精度的方式获得更大的存储,而他能精确保存的数字位数为十进制的15或16位,要比long小

由图可以看见,double类型在存储时,牺牲了精度,导致结果不准确

(2)StreamTokenizer读入太长的字符串时也会有问题 


二、min和max值的设置

min设为最大值(以及这样设的易错点),max设为最小值,求和初始值为0,求积初始值为1简单理解这样设的原理,min要存储最小值,我们在给min设初始值的时候不能影响我的最终结果,那我肯定不能设一个小的值,假设设为0,那么输入是1234,这样你的min输出的是几?自然是0,但实际最小值是1,这是因为我们的初始值,影响到了答案,所以要设一个题目中的最大值或者设一个不会出现的最大值也行。

一般都这样设置:int min = Integer.MAX_VALUE

但是也存在一定的弊端:

如果遇到了以下代码if(min+a>b),类似这种判断很容易出现问题,本身min是整数类型的最大值,它在加上a,很可能爆int直接变成负数,那么就会导致判断出错。这样写的时候可以加一个判断if(min!=Integer.MAX_VALUE&&min+a>b)。


 三、妮妮的翻转游戏

import java.util.*;

public class 妮妮的翻转游戏 {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		int n = s.nextInt();
		//解法1:if else语句		
		if(n==0) System.out.print(1);
		else System.out.print(0);
		//解法2:异或(找不同)
		System.out.print(n^1);
		//解法3:取反
		System.out.print(~n+2);//~n=-n-1
		//解法4:三目运算符
		System.out.print(n==1?0:1);
	}
}

四、小明和完美序列

思路1:只看删除

eg:对于3这个数字,如果3的个数<3,那么就需要全删;如果3的个数>3,那么就需要删到3个

因为本题每个数字都有一个对应的值,所以可以考虑map(key,value) (用数组时间会超时)

那么如果3的个数<3,那么就删value次;如果3的个数>3,那么就需要删value-key次

import java.util.*;

public class 小明和完美序列 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		HashMap<Integer,Integer> map = new HashMap<>();
		//输入数据并放入map
		for(int i=0;i<n;i++) {
			int a = scan.nextInt();
//			if(!map.containsKey(a)) {//第一次放入,value置为1
//				map.put(a, 1);
//			}else {
//				map.put(a, map.get(a)+1);//非第一次放入,value+1
//			}
			
			//这一行可以代替上面,getOrDefault方法
			map.put(a, map.getOrDefault(a, 0)+1);
		}
		int count = 0;//要删除的次数
		for(Integer e : map.keySet()) {//从map中遍历每个key
			if(map.get(e)>e) {//相当于>3次
				count+=map.get(e)-e;
			} else if(map.get(e)<e) {//相当于<3次
				count+=map.get(e);
			}
		}
		System.out.print(count);
	}
}

思路2:看保留(找到本来需要保留的个数m和现有的总次数n,删除的次数count=n-m)

但是注意:只有value>=key的时候才进行保留

import java.util.*;

public class 小明和完美序列 {
	public static void main(String[] args) { 
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		HashMap<Integer,Integer> map = new HashMap<>();
		for(int i=0;i<n;i++) {
			int a = scan.nextInt();
			map.put(a, map.getOrDefault(a, 0)+1);
		}
		int sum = 0;//要保留的次数
		for(Integer e:map.keySet()) {
			if(map.get(e)>=e) {
				sum+=e;
			}
		}
		System.out.print(n-sum);
		
	}
}

五、顺子日期(填空题)

思路1:手写日期模拟器 注意闰年

public class 顺子日期 {
	static int year=2022,month=1,day=1;
	static int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//注意2月
	public static void main(String[] args) {
		//手写日期模拟器自动生成下一个日期
		Scanner scan = new Scanner(System.in);
		int count = 0;//顺子日期的个数
		while(year!=2023) {
			if(check()) {//判断是否满足顺子日期
				count++;
			}
			day++;
			if(month==2) {
				//闰年29天特殊考虑
				if(year%400==0||(year%4==0&&year%100!=0)) {
					if(day>29) {
						month++;
						day=1;
					}
				}else {
					if(day>28) {
						month++;
						day=1;
					}
				}
			}else {
				if(day>days[month]) {//day超过了本月的天数范围
					month++;
					day=1;
				}
			}
			
			if(month==13) {//month超过了12
				year++;
				month=1;
			}
		}
		System.out.print(count);
	}
	//判断是否满足顺子日期
	private static boolean check() {
		//数字形式
		int num = 0;
		num += year;
		num =num*100+month;
		num =num*100+day;
		//转为字符串的形式
		String string = String.valueOf(num);
		//正式开始判断:思路如果后面一个字符是前面字符+1那么就step++,直到step到3
		int step = 1;
		for(int i =1;i<string.length();i++) {
			if(string.charAt(i-1)+1==string.charAt(i)) {
				step++;
			} else {
				step=1;//不是顺子重新开始
			}
			//如果step到3就是顺子日期
			if(step==3) {
				return true;
			}
		}
		return false;
	}
}

思路2:java自带的日期函数

(1)用到了Calendar calendar = Calendar.getInstance();的set和get方法

注意set方法中的bug:month是从0开始的

(2)用到了SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");//规范日期的写法

//方法2:java自带的日期函数
public class 顺子日期 {
	public static void main(String[] args) {
		String [] seq = {"012","123"};//day不可能为4-9
		Calendar calendar = Calendar.getInstance();
		calendar.set(2022, 0,1);//为什么月要初始化为0:这里相当于一个bug,这个函数月就是从0开始的
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");//规范日期的写法
		int count = 0;
		//开始统计顺子日期的数目
		while(calendar.get(calendar.YEAR)==2022) {//取出calendar中的年份
			String date = sdf.format(calendar.getTimeInMillis());//让date规范为yyyyMMdd
			//遍历字符串看有没有这个可能存在的顺子
			for(String s:seq) {
				if(date.contains(s)) {
					count++;
					break;//有两个顺子也算一个日期,count只能加一次
				}
			}
			calendar.add(calendar.DATE, 1);//日期+1
		}
		System.out.print(count);
		
	}
}

六、星期计算(填空题)

20的22次方已经超过了long类型的范围

解法1:BigInteger类(这个类在java中可以表示任意大小的整数,没有固定的范围限制)

import java.math.BigInteger;

public class 星期计算 {
	public static void main(String[] args) {
		BigInteger bigInteger = new BigInteger("20");
        //运算类型都得是BigInteger类型
		BigInteger n = bigInteger.pow(22).mod(new BigInteger("7"));
		System.out.print(n);
	}
}

得到的答案是1,那么结果直接输出7即可

解法2: 数学方法:(a*b)%p=(a%p*b%p)%p

int mod7 = 1;
for(int i=1;i<=22;i++) {
	mod7 = (mod7*20)%7;//每一次次方都%7
}
System.out.print(mod7);

七、山(填空题)

思路:回文&&单调性

//思路:回文判断+单调性判断(这样就只用判断一边)
public class 山 {
	public static void main(String[] args) {
		int n = 0;
		for(int i=2022;i<=2022222022;i++) {
			if(huiwen(i)&&dandiao(i)) {
				n++;
			}
		}
		System.out.print(n);
	}
	//判断单调性
	private static boolean dandiao(int n) {
		int[] a = new int[10];
		int i=0;
		while(n>0) {
			a[i++] = n%10;
			n =n/10;
		}
		int l=i/2;
		for(int j=1;j<=l;j++) {
			if(a[j]<a[j-1]) {
				return false;
			}
		}
		return true;
	}

	//回文判断:思路前后指针遍历,看是不是一样
	public static boolean huiwen(int n) {
		int[] a = new int[10];
		int i =0;
		//把数字放入数组
		while(n>0) {
			a[i++] = n%10;
			n =n/10;
		}
		int l=0,r=i-1;
		while(l<r) {
			if(a[l]!=a[r]) {
				return false;
			}
			l++;
			r--;
		}
		return true;
	}
}

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

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

相关文章

如何删除视频中不想要的部分?分享实用工具和步骤!

在数字化时代&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是观看电影、记录生活&#xff0c;还是制作专业的广告、教学材料&#xff0c;我们都需要对视频进行编辑处理。其中&#xff0c;删除视频中不想要的部分是最常见的需求之一。那么&#xff0c;如何轻松实现这…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

Jvm之内存泄漏

1 内存溢出 1.1 概念 java.lang.OutOfMemoryError&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现OutOfMemoryError。产生该错误的原因主要包括&#xff1a;JVM内存过小。程序不严密&#xff0c;产生了过多的垃圾。 程序体现: 内…

Win UI3开发笔记(四)设置主题续

上文讲到过关于界面和标题栏以及普通文本的主题设置&#xff0c;这篇说一下关于对话框的主题设置。 我最终没找到办法&#xff0c;寻求办法的朋友可以不用接着看了&#xff0c;以下只是过程。 一个对话框包括标题部分、内容部分和按钮部分&#xff0c;其中&#xff0c;在Cont…

论文笔记:A survey on zero knowledge range proofs and applications

https://link.springer.com/article/10.1007/s42452-019-0989-z 描述了构建零知识区间证明&#xff08;ZKRP&#xff09;的不同策略&#xff0c;例如2001年Boudot提出的方案&#xff1b;2008年Camenisch等人提出的方案&#xff1b;以及2017年提出的Bulletproofs。 Introducti…

Python 全栈系列227 部署chatglm3-API接口

说明 上一篇介绍了基于算力租用的方式部署chatglm3, 见文章&#xff1b;本篇接着看如何使用API方式进行使用。 内容 1 官方接口 详情可见接口调用文档 调用有两种方式&#xff0c;SDK包和Http。一般来说&#xff0c;用SDK会省事一些。 以下是Python SDK包的git项目地址 安…

ChatGPT 正测试Android屏幕小组件;联想ThinkBook 推出透明笔记本电脑

▶ ChatGPT 测试屏幕小组件 近日 ChatGPT 正在测试 Android 平台上的屏幕小组件&#xff0c;类似于手机中的悬浮窗&#xff0c;按住 Android 手机主屏幕上的空白位置就可以调出 ChatGPT 的部件菜单。 菜单中提供了许多选项&#xff0c;包括文本、语音和视频查询的快捷方式&…

vue3的echarts从后端获取数据,用于绘制图表

场景需求&#xff1a;后端采用flask通过pymysql从数据库获取数据&#xff0c;并返回给前端。前端vue3利用axios获取数据并运用到echarts绘制图表。 第一步&#xff0c;vue中引入echarts 首先vue下载echarts npm install echarts 然后在main.js文件写如下代码 import {create…

【appium】App类型、页面元素|UiAutomator与appium|App元素定位

目录 一、App前端基础知识 1、App类型划分 2、App类型对比 3、App页面元素 App页面元素分为布局和控件两种 常见布局&#xff1a; 常见控件&#xff1a;定位软件&#xff1a;appium和sdk自带的uiautomatorviewer都可以定位 二、App元素定位 1、id定位 2、text定位 3…

RISC-V SoC + AI | 在全志 D1「哪吒」开发板上,跑个 ncnn 神经网络推理框架的 demo

引言 D1 是全志科技首款基于 RISC-V 指令集的 SoC&#xff0c;主核是来自阿里平头哥的 64 位的 玄铁 C906。「哪吒」开发板 是全志在线基于全志科技 D1 芯片定制的 AIoT 开发板&#xff0c;是目前还比较罕见的使用 RISC-V SoC 且可运行 GNU/Linux 操作系统的可量产开发板。 n…

Linux:Ansible的常用模块

模块帮助 ansible-doc -l 列出ansible的模块 ansible-doc 模块名称 # 查看指定模块的教程 ansible-doc command 查看command模块的教程 退出教程时候建议不要使用ctrlc 停止&#xff0c;某些shell工具会出现错误 command ansible默认的模块,执行命令&#xff0c;注意&#x…

【MySQL】DQL

DQL&#xff08;数据查询语言&#xff09;用于在MySQL数据库中执行数据查询操作。它主要包括SELECT语句&#xff0c;用于从表中检索数据。 0. 基本语法 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 …

【深度学习】Pytorch教程(八):PyTorch数据结构:2、张量的数学运算(6):高维张量:乘法、卷积(conv2d~四维张量;conv3d~五维张量)

文章目录 一、前言二、实验环境三、PyTorch数据结构1、Tensor&#xff08;张量&#xff09;1. 维度&#xff08;Dimensions&#xff09;2. 数据类型&#xff08;Data Types&#xff09;3. GPU加速&#xff08;GPU Acceleration&#xff09; 2、张量的数学运算1. 向量运算2. 矩阵…

NerfStudio安装及第一个场景重建

NerfStudio文档是写在windows和linux上安装&#xff0c;本文记录Linux安装的过程&#xff0c;且我的cuda是11.7 创建环境 conda create --name nerfstudio -y python3.8 conda activate nerfstudio python -m pip install --upgrade pip Pytorch要求2.0.1之后的,文档推荐cud…

Vue:【亲测可用】父组件数组包对象,传给子组件对象,子组件修改属性(字段)后,父组件没有更新

场景&#xff1a;vue中父组件数组包对象&#xff0c;传给子组件对象&#xff0c;子组件修改属性&#xff08;字段&#xff09;后&#xff0c;父组件没有更新 代码&#xff1a; # 父组件 <div v-for"(object, name, index) in arr" :key"index"><…

autocrlf和safecrlf

git远程拉取及提交代码&#xff0c;windows和linux平台换行符转换问题&#xff0c;用以下两行命令进行配置&#xff1a; git config --global core.autocrlf false git config --global core.safecrlf true CRLF是windows平台下的换行符&#xff0c;LF是linux平台下的换行符。…

jvm常用参数配置

一、 常用参数 -Xms JVM启动时申请的初始Heap值&#xff0c;默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时&#xff0c;JVM会减小heap的大小到-Xms指定的大小&#xff0c;可通过-XX:MaxHeapFreeRation来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同…

LVGL 环境搭建-基于WSL

背景说明 小白刚开始接触LVGL&#xff0c;前些日子狠心花198元入手了一块堪称LVGL 入门利器~HMI-Board 开发板&#xff0c;虽然有RT-Thread 集成好的LVGL 环境&#xff0c;只需要几个步骤就能成功把lvgl 的示例运行起来&#xff0c;对于爱折腾的我来说&#xff0c;过于简单也并…

Nginx高级技巧:实现负载均衡和反向代理

文章目录 Nginx概述Nginx作用正向代理反向代理负载均衡动静分离 Nginx的安装 -->Docker3.1 安装Nginx3.2 Nginx的配置文件3.3 修改docker-compose文件 Nginx源码安装nginx常用命令nginx配置文件配置文件位置配置文件结构详情 Nginx的反向代理【重点】基于Nginx实现反向代理4…

pandas两列或多列全组合

现有星期、国家、标签三类数据&#xff0c;希望得到全部组合&#xff0c;实现方式如下&#xff1a; #星期和国家全组合 a1pd.DataFrame(indexrange(7),columns[星期],datanp.arange(0,7)) b1pd.DataFrame(data[美国,新加坡],columns[国家]) c1pd.DataFrame(data[a,b],columns[…