Api运用题
例题1: 世纪末的星期(经典日期API问题)
题目:有邪教称1999年12月31日是世界末日,当然谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会…有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!!!于是"谣言制造商"又修改为星期日…
1999年12月31日是星期五,请问:未来哪一个离我们最近的一个世纪末年(即XX99年)的12月31日正好是星期天(即星期日)?
回答年份即可
知识点:这道题运用到了一个java日历类,笔记在java知识点中了
package one;
import java.util.Calendar;
public class None_1 {
public static void main1(String[] args) {
// 获取一个日历类来实现这个功能calendar
// 因为这个日历类是一个抽象类所以不能直接new,但可以通过getInstance来
// 获取一个实例
Calendar calendar=Calendar.getInstance();
// 因为末日年都是以99结尾的所以可以将当前的时间加上100
for(int i=1999;i<10000;i+=100) {
// 通过set方法,为calendar的属性设置参数
calendar.set(Calendar.YEAR, i);
calendar.set(Calendar.MONTH, 11);
calendar.set(Calendar.DATE, 31);
// 获取当前calendar的星期数
if(calendar.get(Calendar.DAY_OF_WEEK)==1){
System.out.println(i);
break;
}
}
}
}
例题2 猜字母(字符处理问题)
题目:
把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字符。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
知识点:使用了StringBuffer API,着道题挺有意思的,理解自动提升索引
package one;
//思路直接一个while循环加上for循环就完事了
public class None_4 {
public static void main(String[] args) {
// 创建一个StringBuffer,方便后面的删除
StringBuffer buf=new StringBuffer();
String str="abcdefghijklmmopqrs";
// 拼接字符串
for(int i=0;i<=105;i++) {
buf.append(str);
}
// 使用while循环和for循环会buf中的字符进行删除
// 我去有大坑,即使我们再删除buf中的数据的时候,数组中的下标在往前移动
// 所以我们不需要,也不能通过判断该位置的下标是不是奇数来删除该数
// 我们想象一下我们在删除的时候数组在往前移动就行,所以每次while循环只需要去掉一半即可
// 奇数的时候需要多删除一个
while(buf.length()>1) {
int len=buf.length();
int dellen;
if(len%2==0) {
dellen=len/2;
}else {
dellen=len/2+1;
}
for(int i=0;i<dellen;i++) {
buf.deleteCharAt(i);
}
}
// 输出最后一个字符
System.out.print(buf.charAt(0));
}
}
例题3: 跑步锻炼
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2
千米。小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1
日周四(含)。请问这段时间小蓝总共跑步多少千米?
package three;
import java.util.Calendar;
//这到题我的思路是借助Calendar来解决
public class Three_4 {
public static void main(String[] args) {
// 创建两个数组分别级录平年和闰年的每个月右多少天
int[] pnums= {31,28,31,30,31,30,31,31,30,31,30,31};
int[] rnums= {31,29,31,30,31,30,31,31,30,31,30,31};
// 获取一个Calendar实例
Calendar calendar=Calendar.getInstance();
// 创建一个变量保存每天所跑的公里数
int count=0;
// 通过三重循环不断的设置calendar的值,以此来判断目前是周几,或者是月几
for(int i=2000;i<=2020;i++) {
for(int j=0;j<=11;j++) {
if(pd(i)) {
for(int k=1;k<=pnums[j];k++) {
if(i==2020 && j==9 && k==2) {
System.out.print(count);
return;
};
calendar.set(i, j, k);
if(calendar.get(Calendar.DAY_OF_WEEK)==2||k==1){
count+=2;
}else {
count++;
}
}
}else {
for(int k=1;k<=rnums[j];k++) {
if(i==2020 && j==9 && k==2) {
System.out.print(count);
return;
};
calendar.set(i, j, k);
if(calendar.get(Calendar.DAY_OF_WEEK)==2||k==1){
count+=2;
}else {
count++;
}
}
}
}
}
}
// 创建一个函数判断是平年还是闰年,如果是平年这返回true,否则返回false
public static boolean pd(int year) {
if((year%100!=0&&year%4==0)||year%400==0) {
return false;
}else {
return true;
}
}
}
例题4: 星期一
整个 2020 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日之间),一共有多少个星期一?
package three;
import java.util.Calendar;
public class Three_5 {
public static void main(String[] args) {
// 创建一个变量来保存结果
int count=0;
// 这到题的解题思路于上一道题的解题思路是一样的,都是对范围内的每一天都及逆行判断
// 创建两个数组分别记录平年和闰年的每个月的天数
int[] pnums= {31,28,31,30,31,30,31,31,30,31,30,31};
int[] rnums= {31,29,31,30,31,30,31,31,30,31,30,31};
// 创建一个calendar类
Calendar calendar=Calendar.getInstance();
// 利用三重for循环对每一天进行遍历
for(int i=1901;i<=2000;i++) {
for(int j=0;j<=11;j++) {
// 先对该年是平年还是闰年进行一个判断
if(i%400==0||(i%100!=0&&i%4==0)) {
for(int k=1;k<=rnums[j];k++) {
// 如果到达了最后一天直接退出
if(i==2000&&j==11&&k==31) {
System.out.print(count);
return;
}
// 设置calendar的属性从而判断这天的是该周的周几
calendar.set(Calendar.YEAR, i);
calendar.set(Calendar.MONTH, j);
calendar.set(Calendar.DATE, k);
// 判断这一天是周几
if( calendar.get(Calendar.DAY_OF_WEEK)==2) {
count++;
}
}
}else {
for(int k=1;k<=pnums[j];k++) {
// 如果到达了最后一天直接退出
if(i==2000&&j==11&&k==31) {
System.out.print(count);
return;
}
// 设置calendar的属性从而判断这天的是该周的周几
calendar.set(Calendar.YEAR, i);
calendar.set(Calendar.MONTH, j);
calendar.set(Calendar.DATE, k);
// 判断这一天是周几
if( calendar.get(Calendar.DAY_OF_WEEK)==2) {
count++;
}
}
}
}
}
}
}
例题5: 3.1棋盘放麦子
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2
粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4 个棋盘格放 8
粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64 格)。国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
package three;
import java.math.BigInteger;
//这道题应该是简单的for循环遍历题,我们需要熟悉的是使用BigInteger这个类的相关操作
public class Three_7 {
public static void main(String[] args) {
// 创建一个变量保存所有小麦的数量的和
BigInteger sum=new BigInteger("0");
// 创建一个初始值为1
BigInteger temp=new BigInteger("1");
// 每次翻倍的倍数
BigInteger mul=new BigInteger("2");
for(int i=1;i<=64;i++) {
sum=sum.add(temp);
temp=temp.multiply(mul);
}
System.out.print(sum);
}
}
例题6:终于结束的起点
这道题只拿了70分,主要是记录一下BigInteger的赋值,以及值比较的方式,赋值时不能使用=,同时比较也不能使用==,因为这是个对象
package 每天打卡;
import java.math.BigInteger;
import java.util.Scanner;
public class Elevent {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int M=scan.nextInt();
BigInteger m=new BigInteger(M+"");
BigInteger temp1=new BigInteger("0");
BigInteger temp2=new BigInteger("1");
long count=0;
while(true) {
if(temp1.mod(m).equals(new BigInteger("0"))&&temp2.mod(m).equals(new BigInteger("1"))&&count>0) {
System.out.print(count);
return;
}
BigInteger temp=temp1.add(new BigInteger("0"));
temp1=temp2.add(new BigInteger("0"));
temp2=temp.add(temp1);
count++;
}
}
}