蓝桥杯题目常用API (JAVA)

在做蓝桥杯的题目时,有些题目的数据难以处理,此时JAVA强大的API可以提供帮助,在此对一些常用的API和数据结构略作总结,有不足之处望指正。

一.BigInteger和BigDecimal

当题目所要处理的数精读比较大,无法使用double类型处理时,可调用BigInteger和BigDecimal这两个API进行处理。其中BigInteger支持任意精度的整数,BigDecimal支持任何精度的定点数。

1.定义常量

BigInteger a = BigInteger.ONE;
BigDecimal b = BigDecimal.TEN;

这里的ONE,ZERO,TEN分别代表1,0,10。

2.声明赋值

BigInteger a = new BigInteger(100);
BigInteger a = BigInteger.valueOf(100); 
BigDecimal b = new BigDecimal(100);
BigDecimal b = BigDecimal.valueOf(100); 

3.常用方法

valueOf(); //将参数转换为指定的类型 
add();//相加 
subtract(); //相减 
multiply(); //相乘 
divide(); //相除取整 
remainder(); //取余 
pow(); //乘方,a.pow(b)=a^b 
gcd(); //最大公约数 
abs(); //绝对值 
negate();// 取反数 
equals(); //是否相等 

4.例题

黄金分割数0.61803… 是个无理数,这个常数十分重要,在许多工程问题中会出现。有时需要把这个数字求得很精确。

对于某些精密工程,常数的精度很重要。也许你听说过哈勃太空望远镜,它首次升空后就发现了一处人工加工错误,对那样一个庞然大物,其实只是镜面加工时有比头发丝还细许多倍的一处错误而已,却使它成了“近视眼”!!

言归正传,我们如何求得黄金分割数的尽可能精确的值呢?有许多方法。

比较简单的一种是用连分数

              1 黄金数 = ---------------------
                    1
         1 + -----------------
                      1
             1 + -------------
                        1
                 1 + ---------
                      1 + ...

这个连分数计算的“层数”越多,它的值越接近黄金分割数。

请你利用这一特性,求出黄金分割数的足够精确值,要求四舍五入到小数点后100位。

小数点后3位的值为:0.618 小数点后4位的值为:0.6180 小数点后5位的值为:0.61803 小数点后7位的值为:0.6180340
(注意尾部的0,不能忽略)

你的任务是:写出精确到小数点后100位精度的黄金分割值。

注意:尾数的四舍五入! 尾数是0也要保留!

显然答案是一个小数,其小数点后有100位数字,请通过浏览器直接提交该数字。

/*	经过化简,发现这个值为斐波那契序列的第n项除以第n+1项。
	但若使用double类型表示,显然无法精确到小数点后100位
	所以这里使用BigInteger和BigDecimal*/
BigInteger a = BigInteger.ONE;
		BigInteger b = BigInteger.ONE;
		for(int i = 3; i < 500 ; i++)
		{
			BigInteger t = b;
			b=a.add(b);
			a=t;
		}
		BigDecimal divid = new BigDecimal(a,110).divide(new BigDecimal(b,110),BigDecimal.ROUND_HALF_DOWN);
		System.out.println(divid.toPlainString().substring(0,103));
	}

二.Calendar

1.简介

calendar时JAVA中表示日期的API,在处理与日期或者时间的问题中可以使用,其中

YEAR 指示年。 MONTH 指示月份。
DAY_OF_MONTH 指示一个月中的某天。
DAY_OF_WEEK 指示一个星期中的某天。
DAY_OF_YEAR 指示当前年中的天数。
DAY_OF_WEEK_IN_MONTH 指示当前月中的第几个星期。
HOUR指示当天中的某小时 MINUTE 指示当前小时中的某分钟
SECOND 指示当前分钟中的某秒

值得注意的是,月份是从0开始到11结束,既输入11代表的为12月而天则是从1开始;星期从1-7分表代表从星期天到星期六。

2.常用方法

创建方法如下:

Calendar calendar = Calendar.getInstance();

常用set方法写入而用get方法读出,写入时,形式为:

calendar.set(calendar.YEAR, year);

3.例题

曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会…

有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是,“谣言制造商”又修改为星期日…

1999年的12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即xx99年)的12月31日正好是星期天(即星期日)?

请回答该年份(只写这个4位整数,不要写12月31等多余信息)

public static void main(String[] args) {
		for(int year = 1999;year<10000;year+=100)
		{
			Calendar calendar = Calendar.getInstance();
			calendar.set(calendar.YEAR, year);
			calendar.set(calendar.MONTH, 11);//这是12月
			calendar.set(calendar.DAY_OF_MONTH, 31);
			if(calendar.get(calendar.DAY_OF_WEEK)==1)//1为周天
				{System.out.println(year);
				break;}
			
		}

三.HashSet

1.简介

HashSet是Set的子类,它的主要特点是:无序性、没有重复、可以有null。在一些需要除去重复元素的题目中,可以使用HashSet来比较容易的解决题目。

2.常用方法

Set<> set = new HashSet<>();//创建
add(); //增加
remove(); //删除
contains(); //对比查找
clear(); //清空集合
size();//获取长度

3.例题

一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab,
aaa, aab, aaab,一共7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001
有多少个不同的非空子串? 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

Set<String> set = new HashSet<String>();
		for(int i = 0;i<s.length();i++)
			for(int j = i ; j<s.length(); j++)
			{
				set.add(s.substring(i,j+1));
			}
		return set.size();
	}
	public static void main(String[] args) {
		String s = "0100110001010001";
		System.out.println(subSum(s));
	}

四.ArrayList

1.简介

ArrayList继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。在题目中,若事先不知道对象的数目或类型,则不能使用数组表示,此时可以使用ArrayList类型。

2.常用方法

add(Object element);//向列表的尾部添加指定的元素。
size();//返回列表中的元素个数。
get(int index);//返回列表中指定位置的元素,index从0开始。
add(int index, Object element);// 在列表的指定位置插入指定元素。
set(int i, Object element);//将索引i位置元素替换为元素element并返回被替换的元素。
clear();//从列表中移除所有元素。
isEmpty();//判断列表是否包含元素,不包含元素则返回 true,否则返回false。
contains(Object o);//如果列表包含指定的元素,则返回 true。
remove(int index);//移除列表中指定位置的元素,并返回被删元素。
remove(Object o);//移除集合中第一次出现的指定元素,移除成功返回true,否则返回false。
iterator();//返回按适当顺序在列表的元素上进行迭代的迭代器

3.例题

某涉密单位下发了某种票据,并要在年终全部收回。 每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。 你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。 要求程序首先输入一个整数N(N<100)表示后面数据行数。 接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000) 每个整数代表一个ID号。
要求程序输出1行,含两个整数m n,用空格分隔。 其中,m表示断号ID,n表示重号ID 例如: 用户输入: 2 5 6 8 11 9 10
12 9 则程序输出: 7 9 再例如: 用户输入: 6 164 178 108 109 180 155 141 159 104 182
179 118 137 184 115 124 125 129 168 196 172 189 127 107 112 192 103
131 133 169 158 128 102 110 148 139 157 140 195 197 185 152 135 106
123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190 149
138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194
187 188 113 130 176 154 177 120 117 150 114 183 186 181 100 163 160
167 147 198 111 119

则程序输出: 105 120

资源约定: 峰值内存消耗(含虚拟机) < 64M CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		scanner.nextLine();//这里很重要,是为了消除整数后面的换行符
		ArrayList<Integer> list= new ArrayList<Integer>();//因为提前不知道长度,所以用arraylist而非数组存储。
		for(int i = 0;i < n;i++)
		{
			String line = scanner.nextLine();
			String[] split =line.split(" ");//这里用空格分割,并且存储到数组
			for(int j= 0;j<split.length;j++)
			{
				list.add(Integer.parseInt(split[j]));//这里用parseInt转换为整数型,并且添加到list
			}
			
		}
		Collections.sort(list);//这里是对list进行从小到大的排序
		int a=0,b=0;
		for(int i = 1;i<list.size();i++)
		{
			if(list.get(i)-list.get(i-1)==2)
			{
				a=list.get(i)-1;
			}
			if(list.get(i).equals(list.get(i-1)))//这里因为get到的为对象而非整数类型,所以不能用==,但是可以用list.get(i)-list.get(i-1)==0
			{
				b=list.get(i);
			}
		}
		System.out.println(a+" "+b);
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值