Java教程系列之反射
¶一、什么是反射
反射:Reflection
反射是为了解决在运行期,对某个实例一无所知的情况下,如何调用其方法。
通过Class实例获取class信息的方法称为反射(Reflection)。
¶二、Class类
class是由JVM在执行过程中动态加载的。JVM在第一次读取到一种class类型时,将其加载进内存。
每加载一种class,JVM就为其创建一个Class类型的实例,并关联起来!
这里的Class类型是一个名叫Class的class。。。。
1、以String类为例,当JVM加载String类时,它首先读取String.class文件到内存,然后,为String类创建一个Class实例并关联起来
2、Class实例是JVM内部创建的,如果我们查看JDK源码,可以发现Class类的构造方法是private,只有JVM能创建Class实例,我们自己的Java程序是无法创建Class实例的。
3、此处为JVM自动创建,是一个私有类!
1Class cls = new Class(String);
一个Class实例包含了该class的所有完整信息!
由于JVM为每个加载的 ...
Java教程系列之异常处理
¶首先来首歌曲来放松一下吧!
¶一、Java的异常
¶1、异常的来源
¶1.1 来源
用户输入造成
随机出现的错误
网络突然断了,连接不到远程服务器;
内存耗尽,程序崩溃了;
用户点“打印”,但根本没有打印机;
……
¶1.2 处理错误的方法
方法一:约定返回错误码。
例如,处理一个文件,如果返回0,表示成功,返回其他整数,表示约定的错误码:
因为使用int类型的错误码,想要处理就非常麻烦。这种方式常见于底层C函数。
一般不这样处理!
1234567891011121314int code = processFile("C:\\test.txt");if (code == 0) { // ok:} else { // error: switch (code) { case 1: // file not found: case 2: // no read permission: default: // unknown error: }}
方法二:在语言层面上提供一个异常处理 ...
Java教程系列之Java核心类
¶首先来首歌曲来放松一下吧!
¶一、字符串和编码
¶1、字符串(String)
在Java中,String是一个引用类型,它本身也是一个class。但是,Java编译器对String有特殊处理,即可以直接用"..."来表示一个字符串!
实际上字符串在String内部是通过一个char[]数组表示的,因此,按下面的写法也是可以的!
因为String太常用了,所以Java提供了"..."这种字符串字面量表示方法。
Java字符串的一个重要特点就是字符串不可变。这种不可变性是通过内部的private final char[]字段,以及没有任何修改char[]的方法实现的。
12String s1 = "hello!";String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});
下面这个输出结果不一样,因为不可变性,所以其实就是指向变了!原来的字符串仍然在内存中!
12345678public class Main { public static void main(String[] args) ...
Java教程系列之面向对象编程
¶首先来首歌曲来放松一下吧!
¶一、class 和 instance
就是常说的类和实例!
¶1、定义class
一个class可以包含多个字段(field),字段用来描述一个类的特征。
上面的Person类,我们定义了两个字段,一个是String类型的字段,命名为name,一个是int类型的字段,命名为age。因此,通过class,把一组数据汇集到一个对象上,实现了数据封装。
public是用来修饰字段的,它表示这个字段可以被外部访问。
123456789101112package com.test;public class codeTest { public static void main(String[] args) { }}class Person { public String name; public int age;}
¶2、创建instance
定义了class,只是定义了对象模版,而要根据对象模版创建出真正的对象实例,必须用new操作符。
new操作符可以创建一个实例,然后,我们需要定义一个引用类型的变量 ...
AcWing-41.包含min函数的栈
¶首先来首歌曲来放松一下吧!
题目链接:41. 包含min函数的栈
¶题目背景:
来源:剑指Offer,《算法竞赛进阶指南》, 美国 Hulu公式 面试题!
两种做法:详细见下文!
¶题目描述
设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。
push(x)–将元素x插入栈中
pop()–移除栈顶元素
top()–得到栈顶元素
getMin()–得到栈中最小元素
¶样例
12345678MinStack minStack = new MinStack();minStack.push(-1);minStack.push(3);minStack.push(-4);minStack.getMin(); --> Returns -4.minStack.pop();minStack.top(); --> Returns 3.minStack.getMin(); --> Returns -1.
¶题目分析:
¶题目要求:
在普通栈的基础上实现一个可以实时获得最小值的 最小栈 ,而且使得复杂度达到O ...
AcWing-114.国王游戏
¶首先来首歌曲来放松一下吧!
题目链接:114. 国王游戏
¶题目背景:
贪心 + 高精度
以前好像在牛客做过一次。。。
以前的题解链接:点击这里!
可以再一次温习一下高精度写法以及本题的贪心思路!
¶题目描述
恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。
首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。
然后,让这 n 位大臣排成一排,国王站在队伍的最前面。
排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:
排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。
注意,国王的位置始终在队伍的最前面。
¶输入格式
第一行包含一个整数 n,表示大臣的人数。
第二行包含两个整数 a 和 b,之间用一个空格隔开,分别表示国王左手和右手上的整数。
接下来 n 行,每行包含两个整数 a 和 b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整 ...
蓝桥杯第十一届软件类校内模拟赛
¶非编程题就不看了,都是水题!
¶5、递增三元组
¶问题描述
在数列 a[1], a[2], …, a[n] 中,如果对于下标 i, j, k 满足 0<i<j<k<n+1 且 a[i]<a[j]<a[k],则称 a[i], a[j], a[k] 为一组递增三元组,a[j]为递增三元组的中心。
给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
¶输入格式
输入的第一行包含一个整数 n。
第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔,表示给定的数列。
¶输出格式
输出一行包含一个整数,表示答案。
¶样例输入
1251 2 5 3 5
¶样例输出
12
¶样例说明
a[2] 和 a[4] 可能是三元组的中心。
¶评测用例规模与约定
对于 50% 的评测用例,2 <= n <= 100,0 <= 数列中的数 <= 1000。
对于所有评测用例,2 <= n <= 1000,0 <= 数列中的数 <= 10000。
¶题解一:暴力题解(或许超时)
可以跨元素 ...
AcWing-112.雷达设备
¶首先来首歌曲来放松一下吧!
题目链接:112. 雷达设备
¶题目背景:
同样是贪心问题!
¶题目描述
假设海岸是一条无限长的直线,陆地位于海岸的一侧,海洋位于另外一侧。
每个小岛都位于海洋一侧的某个点上。
雷达装置均位于海岸线上,且雷达的监测范围为d,当小岛与某雷达的距离不超过d时,该小岛可以被雷达覆盖。
我们使用笛卡尔坐标系,定义海岸线为x轴,海的一侧在x轴上方,陆地一侧在x轴下方。
现在给出每个小岛的具体坐标以及雷达的检测范围,请你求出能够使所有小岛都被雷达覆盖所需的最小雷达数目。
¶输入格式
第一行输入两个整数n和d,分别代表小岛数目和雷达检测范围。
接下来n行,每行输入两个整数,分别代表小岛的x,y轴坐标。
同一行数据之间用空格隔开。
¶输出格式
输出一个整数,代表所需的最小雷达数目,若没有解决方案则所需数目输出“-1”。
¶数据范围
1≤n≤1000
¶输入样例:
12343 21 2-3 12 1
¶输出样例:
12
¶题目分析:
¶题目要求:
简单来说,就是给一条数轴,在数轴上方有一些点(小岛),要在数轴上放置雷达,使得可以使每个点都被覆盖住!
求达 ...
AcWing-111.畜栏预定
¶首先来首歌曲来放松一下吧!
题目链接:111. 畜栏预定
¶题目背景:
贪心证明略过。。。
本题我在出列排序后的第一头牛时出现了问题,粗心了。。。
¶题目描述
有N头牛在畜栏中吃草。
每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏。
给定N头牛和每头牛开始吃草的时间A以及结束吃草的时间B,每头牛在[A,B]这一时间段内都会一直吃草。
当两头牛的吃草区间存在交集时(包括端点),这两头牛不能被安排在同一个畜栏吃草。
求需要的最小畜栏数目和每头牛对应的畜栏方案。
¶输入格式
第1行:输入一个整数N。
第2…N+1行:第i+1行输入第i头牛的开始吃草时间A以及结束吃草时间B,数之间用空格隔开。
¶输出格式
第1行:输入一个整数,代表所需最小畜栏数。
第2…N+1行:第i+1行输入第i头牛被安排到的畜栏编号,编号是从1开始的 连续 整数,只要方案合法即可。
¶数据范围
1≤N≤50000
1≤A,B≤1000000
¶输入样例:
12345651 102 43 65 84 7
¶输出样例:
123456412324
¶题目分析:
¶题目要求:
给出n头牛吃 ...
AcWing-110.防晒
¶首先来首歌曲来放松一下吧!
题目链接:110. 防晒
¶题目背景:
贪心的证明就略过了,运用了大量数学知识,二分图。。。。
¶题目描述
有C头奶牛进行日光浴,第i头奶牛需要minSPF[i]到maxSPF[i]单位强度之间的阳光。
每头奶牛在日光浴前必须涂防晒霜,防晒霜有L种,涂上第i种之后,身体接收到的阳光强度就会稳定为SPF[i],第i种防晒霜有cover[i]瓶。
求最多可以满足多少头奶牛进行日光浴。
¶输入格式
第一行输入整数C和L。
接下来的C行,按次序每行输入一头牛的minSPF和maxSPF值,即第i行输入minSPF[i]和maxSPF[i]。
再接下来的L行,按次序每行输入一种防晒霜的SPF和cover值,即第i行输入SPF[i]和cover[i]。
每行的数据之间用空格隔开。
¶输出格式
输出一个整数,代表最多可以满足奶牛日光浴的奶牛数目。
¶数据范围
1≤C,L≤2500
1≤minSPF≤maxSPF≤1000
1≤SPF≤1000
¶输入样例:
1234563 23 102 51 56 24 1
¶输出样例:
12
¶题目分析:
¶题目要 ...
AcWing-109.天才ACM
¶首先来首歌曲来放松一下吧!
题目链接:109. 天才ACM
¶题目背景:
又是一道好题,参考了许多题解,明白后,有因为粗心,debug了好久才AC了!
¶题目描述
给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下:
从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整数不够 M 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值就称为集合 S 的“校验值”。
现在给定一个长度为 N 的数列 A 以及一个整数 T。
我们要把 A 分成若干段,使得每一段的“校验值”都不超过 T。
求最少需要分成几段。
¶输入格式
第一行输入整数 K,代表有 K 组测试数据。
对于每组测试数据,第一行包含三个整数 N,M,T 。
第二行包含 N 个整数,表示数列A1,A2…AN。
¶输出格式
对于每组测试数据,输出其答案,每个答案占一行。
¶数据范围
1≤K≤12
1≤N,M≤500000
0≤T≤1018
0≤Ai≤220
¶输入样例:
1234525 1 498 2 1 7 95 1 648 2 1 7 9
¶输出 ...
AcWing-108.奇数码问题
¶首先来首歌曲来放松一下吧!
题目链接:108.奇数码问题
¶题目背景:
同样是归并排序求逆序对的问题!
参考我关于这类问题的一篇题解:AcWing-788.逆序对的数量
奇偶性很神奇,对于一类问题,如果属于同种性质(奇偶性相同),那么它们就是完全相同(这个在某种意义上说)的,一些特殊的情况又例外!
¶题目描述
你一定玩过八数码游戏,它实际上是在一个3×3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3×3的网格中。
例如:
1235 2 81 3 _4 6 7
在游戏过程中,可以把空格与其上、下、左、右四个方向之一的数字交换(如果存在)。
例如在上例中,空格可与左、上、下面的数字交换,分别变成:
1235 2 8 5 2 _ 5 2 81 _ 3 1 3 8 1 3 74 6 7 4 6 7 4 6 _
奇数码游戏是它的一个扩展,在一个n×n的网格中进行,其中n为奇数,1个空格和1~n2−1这n2−1个数恰好不重不漏地分布在n×n的网格中。
空格移动的规则与八数码游戏相同,实际上, ...