Java API运用题

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++;
	  }
  }
}

last

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值