PTA题目集总结
PTA题目集1-3总结
一:前言
我认为题目集一的有八个题目,题量可能稍微有点多,但是题型较为简单,基本为入门题;题集二有五道题,题量适度,难度也适中;题集三虽然只有三道题,但是难度却骤然提升,前两题还好,尤其是第三题,难度较大。
二:设计与分析
题目集一:
7-2:本题为一个将数字与字母转换的题目,他考查了对于数据的输入、字母大小写的转换、if-else语句以及当输入多个连续字符时如何只取第一个字符,在本题中我认为比较关键的在与使用toUpperCase()方法将小写字母转换为大写字母,第二个就是charAt(0),此时0表示为检索字符串中的第一个字符,该方法表示返回指定索引处的值。
letter=letter.toUpperCase();
char c = letter.charAt(0);
7-3:本题为一个成绩分级管理题,他考查了switch-case的运用,与C语言类似,需要注意的是case后面break的使用。
7-5:本题为计算钱币,主要需要注意强制类型转换需要在其前面加上转换的类型,如:
a = (int)money/10;
7-6:本题为使用一维数组求平均值,主要考查了java中如何一维数组的使用,如一维数组的声明、创建以及从键盘的输入等。
int [] number = new int[5];
int sum=0,average=0;
for(int i=0;i<number.length;i++) {
number[i] = in.nextInt();
sum = sum + number[i];
}
7-7:本题为一个排序题,思路其实可以同之前学过的C语言一般使用冒泡,选择等,但在java中我发现直接有函数可以直接使用对其排序即Arrays.sort();方法,使用前先将所有数据存入一个数组中,直接使用该方法即可对数组中的数字进行排序,简洁方便。
int n = in.nextInt();
int [] number = new int[n];
int temp;
for(int i=0;i<n;i++) {
number[i] = in.nextInt();
}
Arrays.sort(number);
System.out.print("The sorted numbers are:");
for(int i=0;i<n;i++) {
System.out.print(number[i]+" ");
}
7-8:本题为判断三角形类型,考查的知识有数组,for循环,if-else等。需要考虑的因素有,第一:判断三边输入是否合法;第二:是否能形成三角形(条件为两边之和是否大于最长的一条边,两边之差是否小于最小的那条边);第三:判断三角形的类型。为了能更好的考虑第二和第三个因素,先将三条边存入一个数组,然后对他们进行排序,可以更好的比较三条边的关系,然后使用if-else以及if-else的嵌套进行判断三角形的类型。
在本题中遇到的问题第一是对各种三角形的情况考虑不够详尽,如在等腰三角形的判断中未考虑到两条短边为等腰边的情况等,第二是在java在判断直角三角形中,对于浮点数的等于判断不能用==来判断,因为计算机表示浮点数都有一个精度限制,对与超出了限制的浮点数计算机会把精度之外的小数部分截掉,所以我们只需要两个浮点数之间的距离小于某个值就可认为他们相等。
import java.util.Arrays;
import java.util.Scanner;
import java.util.*;
public class Main { public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
double [] length = new double[3];
for(int i=0;i<3;i++) {
length[i] = in.nextDouble();
}
Arrays.sort(length);
if(length[2]>200||length[0]<1) {
System.out.println("Wrong Format");
}
else {
if(length[0]+length[1]<=length[2]||length[2]-length[1]>=length[0])
System.out.println("Not a triangle");
else if(length[0]==length[1]&&length[1]==length[2])
System.out.println("Equilateral triangle");
else if(length[0]==length[1]&&length[0]*length[0]+length[1]*length[1]-length[2]*length[2]<0.000001)
System.out.println("Isosceles right-angled triangle");
else if(length[0]==length[1]||length[1]==length[2])
System.out.println("Isosceles triangle");
else if(length[0]*length[0]+length[1]*length[1]-length[2]*length[2]<0.000001)
System.out.println("Right-angled triangle");
else
System.out.println("General triangle"); } } }
题目集二:
7-1:本题为IP地址转换,将二进制转换为十进制,主要考查的是对字符串和数组的使用,以及两个方法substring(),Integer.parseInt()等。开始我把他看成了数字来处理后来发现比较麻烦于是改成当做字符串来处理,先判断是否合法,其中使用了for循环和charAt()方法进行判断,后面使用for循环和substring()方法将字符串截成四个八位的字符串然后再使用Integer.parseInt()将其转换为十进制。以下为将二进制转换为十进制的关键代码:
for(int i=0;i<4;i++) {
b =num.substring(i*8,i*8+8);
a=Integer.parseInt(b,2);
System.out.print(a);
if(i!=3)
System.out.print(".");
}
7-4:本题是要求下一天,该题要考虑的因素较多,首先考虑是否为闰年,然后判断年月日是否合法,如果年份的不在取值范围[1820,2020] ,月份不在取值范围[1,12] ,日期不在取值范围[1,31] 即为不合法,二月份较为特殊,我们需要单独考虑,闰年二月份只有28天,平年二月份有29天,接着就是考虑剩下的月份,因为剩下只有两种情况30天和31天,因此将月份为30天的存入一个数组,月份为31天的存入另一个数组,这样我们只需要用for循环即可判断输入月份的日期是否正确;
public static boolean checkInputValidity(int year, int month, int day) {
if (year < 1820 || year > 2020 || month < 1 || month > 12 || day < 1 || day > 31) {
return false;
}
if (isLeapYear(year)) {
if (month == 2) {
if (day > 29)
return false;
} } else {
if (month == 2) {
if (day > 28)
return false;
}
}
int[] a = { 1, 3, 5, 7, 8, 10, 12 };
for (int i = 0; i < a.length; i++) {
if (month == a[i]) {
if (day > 31)
return false;
}
}
int[] b = { 4, 6, 9, 11 };
for (int j = 0; j < b.length; j++) {
if (month == b[j]) {
if (day > 30)
return false;
}
}
return true;
}
接着就是对下一天的计算,我们需要单独考虑十二月份和闰年,平年的二月份的月末,十二月份下一天年份改变,闰年平年的二月月末分别为28,29,其他月份主要考虑到月末情况时有更多变量即可,主要使用的就是if-else以及for循环。因为我的在跨月份的计算中我直接令日期为1,因此在1,3,5,7,8,10月份判断为月末时应将日期改为0,这样在他们进入到另一个月份时日期才会是1。
public static void nextDate(int year,int month,int day){ int []a= {1,3,5,7,8,10};
int []b= {4,6,9,11};
if( isLeapYear(year)) {
if(month==2) {
if(day==29){
month++;
day=1;
}
else{
day++;
}
} }
else {
if(month==2) {
if(day==28){
month++;
day=0;
}
else{
day++;
}
}
}
for(int i=0;i<a.length;i++) {
if(month==a[i]) {
if(day==31){
month++;
day=0;
}
else{
day++;
}
}
}
for(int j=0;j<b.length;j++) {
if(month==b[j]) {
if(day==30){
month++;
day=1;
}
else{
day++;
}
}
} if(month==12){
if(day==31){
year++;
month=1;
day=1;
}
else{
day++;
}
}
System.out.println("Next date is" + ":" + year + "-" + month + "-" + day);
}
7-5:本题为求前N天,该题与7-4相似,但是本题需要考虑的情况比前一题要更多,第一:N可能为正数也可能为负数;第二:他前N天可能会到钱一个月也有可能到后一个月;第三:在十二月时,他可能会到下一年,在一月时可能会到上一年,这时需要考虑新的年份是否在合法范围内;第四:闰年,平年的二月份需要另外考虑,所以当月份为三月份时且前N天到了二月份时需要另外考虑;其他的月份按照一般的思路,然后使用if-else进行判断即可。
public static void nextDates(int year,int month,int day,int n) { if(day-n<0) {
if(month==1)
System.out.println(n+" days ago is:"+(year-1)+"-"+12+"-"+(31+(day-n)));
else if(month==3&&isLeapYear(year))
System.out.println(n+" days ago is:"+year+"-"+2+"-"+(29+(day-n)));
else if(month==3&&!isLeapYear(year))
System.out.println(n+" days ago is:"+year+"-"+2+"-"+(28+(day-n)));
else if(month==2||month==4||month==6||month==8||month==9||month==11)
System.out.println(n+" days ago is:"+year+"-"+(month-1)+"-"+(31+(day-n)));
else
System.out.println(n+" days ago is:"+year+"-"+(month-1)+"-"+(30+(day-n)));
}
else {
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) {
if(day-n<=31) {
System.out.println(n+" days ago is:"+year+"-"+month+"-"+(day-n));
}
else {
month++;
if(month>12) {month=1;year++;day=day-n-31;}
System.out.println(n+" days ago is:"+year+"-"+month+"-"+day);
}
}
else if(month==4||month==6||month==9||month==11) {
if(day-n<=30) {
System.out.println(n+" days ago is:"+year+"-"+month+"-"+(day-n));
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10) {
if(day-n>31) {
System.out.println(n+" days ago is:"+year+"-"+(month+1)+"-"+((day-n)-31));
}
}
else if(month==4||month==6||month==9||month==11) {
if(day-n>30) {
System.out.println(n+" days ago is:"+year+"-"+(month+1)+"-"+((day-n)-30));
}
} else if(month==2&&isLeapYear(year)&&(day-n)<29)
System.out.println(n+" days ago is:"+year+"-"+2+"-"+(day-n));
else if(month==2&&isLeapYear(year)&&(day-n)>29)
System.out.println(n+" days ago is:"+year+"-"+3+"-"+((day-n)-29));
else if(month==2&&!isLeapYear(year)&&(day-n)<28)
System.out.println(n+" days ago is:"+year+"-"+2+"-"+(day-n));
else if(month==2&&!isLeapYear(year)&&(day-n)>28)
System.out.println(n+" days ago is:"+year+"-"+3+"-"+((day-n)-28)); }
}
题目集三:
7-2:本题为定义一个日期类Date。本题主要是锻炼我们如何写类,我们要先定义一个类Date,包含三个私有属性年(year)、月(month)、日(day),然后使用他的构造方法,无参构造和有参构造,以及私有属性的获取和修改,再在类中定义计算日期的方法,同题目集7-4,7-5类似。在写这个类时,我没有将属性定义为私有属性,这样可能会导致有些属性被改动,所以这是不太好的。
class Date{
int year;
int month;
int day;
int [] mon_maxnum1 = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int [] mon_maxnum2 = {0,31,28,31,30,31,30,31,31,30,31,30,31}; public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
} Date(){ }
public Date(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
}
}
而我们在主函数中需要创建对象才能对类中对象和方法进行调用,同时在对方法的调用时需要使用.操作符。
Date a= new Date();
if(a.checkInputValidity(year,month,day)) {
a.getNextDate(year,month,day);
}
else
System.out.println("Date Format is Wrong");
}
7-3:本题为一元多项式求导,主要要求我们会使用正则表达式,以及如何求导,因未接触过该类题型需提前自学。首先考虑表达式是否合法:第一:考虑为常数项的情况;第二:只有指数时;第三:只有系数时;第四:指数,系数都含有时,使用正则表达式进行判断。最后求导。
三:踩坑心得
在这三个题集,感觉我老是存在的问题是对考虑问题的不够全面,代码排版有的不是很好,还有简单的语法问题,以及对于数组的灵活运用不够好,使得代码特别长和复杂,对于类的使用不太熟系。
四:改进建议
在类中尽量使用私有属性,这样的话可以防止外面的程序随意修改一个类的成员变量,不然可能会造成不可预料的程序错误;
在数组中尽量使用length,这样可以对程序员对后续对代码的修改更方便,也可以减少错误。
五:总结
1:学习到了java的基本使用,如从键盘输入和输出,创建数组等;
2:学习到了java的许多新函数,如toUpperCase() ,charAt(),Arrays.sort(),substring(),Integer.parseInt()等;
3:学习到了类,对象,数据域,构造方法等,以及public,private等不同属性,还有this的使用;
4:对类,对象还不太熟悉,有一些概念等了解不够透彻,上手较慢,还需要多看书,多做题并对自己所做过的题目多加总结和思考;
5:正则表达式还没有掌握如何正确且灵活的使用,需要继续学习。
PTA题目集总结的更多相关文章
- PTA题目集7-9总结
PTA题目集7-9总结 一.前言 题目集七:该题集为轮到图形卡片排序游戏题,主要考查的知识点有类的继承,ArrayList泛型的使用,Compabale接口的运用,多态的使用方法以及接口的应用,难度较 ...
- PTA题目集4-6总结
PTA题目集4-6总结 一:前言 在题集4-6中,所考查的主要知识点有正则表达式,类与类之间的调用,类的聚合,继承,封装,接口与多态,三种排序方法如选择排序,冒泡排序,插入排序,ArrayList,s ...
- 皓远的第一次博客作业(pta题目集——1-3)
题目集总结: 前言: 一. 知识点运用: ① Java入门的基础语法(循环,判断,字符串,数组等等),Java的基础类运用,类与对象关系调用,类间关系(聚合). ② 引(类与对象): 对象 ...
- PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-43字符串关键字的散列映射 (25 分) 7-43 字符串关键字的散列映射 (25 分) 给定一系列由大写英文字母组成的字符串关键字和素数P,用移位法定义 ...
- PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分)
PTA数据结构与算法题目集(中文) 7-42整型关键字的散列映射 (25 分) 7-42 整型关键字的散列映射 (25 分) 给定一系列整型关键字和素数P,用除留余数法定义的散列函数将关键字映射 ...
- PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分)
PTA数据结构与算法题目集(中文) 7-41PAT排名汇总 (25 分) 7-41 PAT排名汇总 (25 分) 计算机程序设计能力考试(Programming Ability Test,简称P ...
- PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分)
PTA数据结构与算法题目集(中文) 7-40奥运排行榜 (25 分) 7-40 奥运排行榜 (25 分) 每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如 ...
- PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)
PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分) 在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...
- PTA数据结构与算法题目集(中文) 7-38寻找大富翁 (25 分)
PTA数据结构与算法题目集(中文) 7-38寻找大富翁 (25 分) 7-38 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假 ...
随机推荐
- [LeetCode]丑数 II&C++中priority_queue和unordered_set的使用
[LeetCode]丑数 II&C++中priority_queue和unordered_set的使用 考虑到现实因素,LeetCode每日一题不再每天都写题解了(甚至有可能掉题目?--)但对 ...
- PHP 通用格式化调试函数
/** * 打印调试函数 * @param $content * @param $is_die */function pre($content, $is_die = true){ header('Co ...
- hdu - 1716 排列2 (使用set对全排列结果去重)
题意很简单,只是有几个细节要注意,首先就是一次只是输入四个数字.输出结果要从小到大(进行全排列之前要进行排序).题目要求千位数相同的在一行,中间使用空格隔开(第二次在输出的时候判断上一次记录的千位数是 ...
- Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?
前言 说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口. 我们都知道,JDBC是Java语言中用来规范客户端程序如何来访 ...
- QFNU-11.08training
7-1 阅览室 题目: 天梯图书阅览室请你编写一个简单的图书借阅统计程序.当读者借书时,管理员输入书号并按下S键,程序开始计时:当读者还书时,管理员输入书号并按下E键,程序结束计时.书号为不超过10 ...
- SE_Work0_回顾与展望
项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求:阅读推荐博客并回答问题 热身作业阅读部分要求 我在这个课程的目标是 提升团队管理及合作能力,开发一项满意的工程项目 这个作业在哪个 ...
- 记一次golang内存泄露
记一次golang内存泄露 最近在QA环境上验证功能时,发现机器特别卡,查看系统内存,发现可用(available)内存仅剩200多M,通过对进程耗用内存进行排序,发现有一个名为application ...
- 要求用户输入若干员工信息,格式为: name,age,gender,salary,hiredate
package day06; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util. ...
- 变量覆盖-高级篇(动态覆盖,extract综合)
0x00 原理 变量覆盖漏洞可以让用户定义的变量值覆盖原有程序变量,可控制原程序逻辑. 0x01 代码 <?php highlight_file('index.php'); function ...
- java基础——简易计算器的实现
计算器: import java.util.Scanner;public class CalculateDemo { public static void main(String[] args ...