pta前三次题目集的总结

发布时间 2023-03-26 15:42:25作者: 一只blog程序猿

(1)前言:前三次题目集的题目数目依次递减,但是难度和涉及的知识点逐渐增大和增加。而每个题目集里的难度又增加,三次题目集主要考察了基本数据类型、三种控制结构、字符串String的用法、StringBuilder的使用和类的构造方法和类方法的调用。

(2)设计与分析:第一次题目集1~4题主要知识点是基本的输入输出、强制转换和三种控制结构,题目比较基础。而第五题就涉及字符和字符串String的用法,同时也涉书本后面的StringBuilder的用法,做这题需要熟悉那些用法。第六题没什么亮点,无非就是对字符串用法的熟悉掌握。而到了第七题就考察了快数排序,用两层循环会超时。第八题难度又开始上升,首先要用一个for循环对其中字符串进行遍历,并边获得每一个位置的字符,再遍历另外一的字符串,用之前获得的字符串与之比较,之后再把不等于另一个字符串的字符放入用StringBuilder创建的对象中。第九题就是对基本语法的考察。第十题虽然文字很多,但只要提取到其中有用的信息,这题也就迎刃而解了,这题考察了字符串的用法,锻炼了我们对题目的分析和逻辑。第十一题就考察了我们的高数,同时需要注意的一个点就是求微积分是求梯形的面积,而不是矩形。第十二题考察基本的语法,一开始我想了很久想先把分母的因子全部求出,然后再用循环遍历1到n-1的数,把这些数用循环和分母的因子相除,但我转念一想,首先我要求出分母的因子,这又得使用循环,而且一个数的因子可能会重复,而且后面判断最简真分数又要使用双层循环,很可能会超时。因此,我就先用一层循环遍历1到n-1,然后再用一层循环遍历2到n-1,让分母和第一层循环的数同时除第二层循环的数...,这种写法简洁明了,但用二层循环没有超时。

               来到第二次题目集,第一题比较基础,唯一需要注意的点就是题目没有给出保留几位小数,需要我们用System.out.print直接输出,但需要对运算结果进行强制转换成float输出,不然答案会错。第二题考察数组,题目比较简单,但是很容易忽略奇数的情况。第三题比较基础,需要注意的点就是题目没有给出保留几位小数,需要我们用System.out.print直接输出,但需要对运算结果进行强制转换成float输出。第四题比较基础,考察了选择结构。第五题稍微有点难度,考察了String的用法,做题时需要用到substring把子字符串提取出来。第六题难度增大,而且定义变量时需要用float定义,用double会出错。接下来就是根据题目写出相关的表达式,而且需要注意循环的条件和表达式的先后。第七题坑有点多,最大的坑就是如何表达''-1'',而且需要注意的是''-1''是个字符串,题目考察字符串的用法和StringBuilder的用法,先要判断字符串是否含有"-1",然后再进行之后的运算。关于我中的一个坑就是在for循环里的循环条件里用s.charAt(i)=='-'&&s.charAt(i+1)=='1'表达"-1",这样显然错误。接下来就是第八题,题目需要注意的一个点就是如何表达直角三角形,很多人肯定认为直角三角形就是两边平方之和等于第三遍,但是由于计算机存储数据有偏差,所以直角三角形的表达式就是两边平方之和减去第三边小于一个很小的数,比如0.01,其他的根据题意写就好了。第九题是本题目集最复杂的题目,主要复杂的地方就是nextDate类方法了,不过我自己最大的问题就是写了垃圾代码,我没注意到月份那些是常量,然后在条件中反复使用那几个月份,没有想到用数组。然后需要注意的是12月31号这一天,加一天就是下一年的年份加一,月份和天数变为一。

             来到第三次题目集,第三次题目集难度较大,也比较花时间,主要是对类的构造方法,方法的调用。第一题就是简单的对类的构造和方法的调用。而从第二题开始难度就提升了一个档次,虽然也是对类的构造和使用,但相比第一题来说更加复杂,做这种题目需要一些耐心,该题目涉及到了LocalDate类,但没有考的很深,只是用LocalDate简单构造一个对象。对于第三题:

我的源码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        int Year=input.nextInt();
        int Month=input.nextInt();
        int Day=input.nextInt();
        Date date=new Date(Year,Month,Day);
        if(date.checkInputValidity()) date.getNextDate();
        else System.out.printf("Date Format is Wrong");
    }
}
class Date{
    private int year=0;
    private int month=0;
    private int day=0;
    public static int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    Date(){
        
    }
    Date(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    int getYear(){
        return year;
    }
    void setYear(int year){
        this.year=year;
    }
    int getMonth(){
        return month;
    }
    void setMonth(int month){
        this.month=month;
    }
    int getDay(){
        return day;
    }
    void setDay(int day){
        this.day=day;
    }
    boolean isLeapYear(int year){
        if((year%4==0&&year%100!=0)||year%400==0) return true;
        else return false;
    }
    boolean checkInputValidity(){
        if((year>=1900&&year<=2000)&&(month>=1&&month<=12)&&(day>=1&&day<=31))
            return true;
        else return false;
    }
    void getNextDate(){
        if(isLeapYear(year)){
                if(mon_maxnum[month]==31){
                    if(month==12){
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year+1,1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                    else{
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                }
                    if(mon_maxnum[month]==30){
                        if(day>30) System.out.println("Date Format is Wrong");
                        if(day<=30){
                            if(day==30) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                        }
                    }
                            if(mon_maxnum[month]+1==29){
                                if(day>29) System.out.println("Date Format is Wrong");
                                if(day<=29){
                                    if(day==29) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                                }
                            }
        }
        else{
                if(mon_maxnum[month]==31){
                    if(month==12){
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year+1,1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                    else{
                        if(day==31) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                        else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                    }
                }
                    if(mon_maxnum[month]==30){
                        if(day>30) System.out.println("Date Format is Wrong");
                        if(day<=30){
                            if(day==30) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                        }
                    }
                            if(mon_maxnum[month]==28){
                                if(day>28) System.out.println("Date Format is Wrong");
                                if(day<=28){
                                    if(day==28) System.out.printf("Next day is:%d-%d-%d",year,month+1,1);
                            else System.out.printf("Next day is:%d-%d-%d",year,month,day+1);
                                }
                            }
        }
    }
}

我的类图:

 

 

分析解释和心得:

第三题和题目集二的最后一题本质上没有什么差别,只是多了类的使用而已,而且在这一题规定使用数组,也算老师的良苦用心了,避免我们写出垃圾代码。当天数达到一个月最大天数时,月份加一,天数变为一。需要注意的是12月31号这一天,加一天就是下一年的年份加一,月份和天数变为一。

对于第四题:

我的源码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int year = 0;
        int month = 0;
        int day = 0;

        int choice = input.nextInt();

        if (choice == 1) { // test getNextNDays method
            int m = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            m = input.nextInt();

            if (m < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " next " + m + " days is:");
            System.out.println(date.getNextNDays(m).showDate());
        } else if (choice == 2) { // test getPreviousNDays method
            int n = 0;
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            DateUtil date = new DateUtil(year, month, day);

            if (!date.checkInputValidity()) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            n = input.nextInt();

            if (n < 0) {
                System.out.println("Wrong Format");
                System.exit(0);
            }

            System.out.print(
                    date.getYear() + "-" + date.getMonth() + "-" + date.getDay() + " previous " + n + " days is:");
            System.out.println(date.getPreviousNDays(n).showDate());
        } else if (choice == 3) {    //test getDaysofDates method
            year = Integer.parseInt(input.next());
            month = Integer.parseInt(input.next());
            day = Integer.parseInt(input.next());

            int anotherYear = Integer.parseInt(input.next());
            int anotherMonth = Integer.parseInt(input.next());
            int anotherDay = Integer.parseInt(input.next());

            DateUtil fromDate = new DateUtil(year, month, day);
            DateUtil toDate = new DateUtil(anotherYear, anotherMonth, anotherDay);

            if (fromDate.checkInputValidity() && toDate.checkInputValidity()) {
                System.out.println("The days between " + fromDate.showDate() + 
                        " and " + toDate.showDate() + " are:"
                        + fromDate.getDaysofDates(toDate));
            } else {
                System.out.println("Wrong Format");
                System.exit(0);
            }
        }
        else{
            System.out.println("Wrong Format");
            System.exit(0);
        }        
    }
}

class DateUtil{
    private int year;
    private int month;
    private int day;
    public static int[] mon_maxnum=new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
    DateUtil(){
        
    }
    DateUtil(int year,int month,int day){
        this.year=year;
        this.month=month;
        this.day=day;
    }
    int getYear(){
        return year;
    }
    void setYear(int year){
        this.year=year;
    }
    int getMonth(){
        return month;
    }
    void setMonth(int month){
        this.month=month;
    }
    int getDay(){
        return day;
    }
    void setDay(int day){
        this.day=day;
    }
    public boolean isLeapYear(int year){
        if((year%4==0&&year%100!=0)||year%400==0) return true;
        else return false;
    }
    public boolean checkInputValidity(){
        if(isLeapYear(year)){
            if(year>=1820&&year<=2020){
            if(month>=1&&month<=12){
                if(mon_maxnum[month]==31){
                    if(day>=1&&day<=31) return true;
                    return false;
                }
                if(mon_maxnum[month]==30){
                    if(day>=1&&day<=30) return true;
                    return false;
                }
                if(mon_maxnum[month]+1==29){
                    if(day>=1&&day<=29) return true;
                    return false;
                }
            }
            return false;
        }
        return false;
        }
        else{
            if(year>=1820&&year<=2020){
            if(month>=1&&month<=12){
                if(mon_maxnum[month]==31){
                    if(day>=1&&day<=31) return true;
                    return false;
                }
                if(mon_maxnum[month]==30){
                    if(day>=1&&day<=30) return true;
                    return false;
                }
                if(mon_maxnum[month]==28){
                    if(day>=1&&day<=28) return true;
                    return false;
                }
            }
            return false;
        }
        return false;
        }
    }
    public DateUtil getNextNDays(int n){
        int i;
        int sum=0;
        int sum1=0;
        int sum2=0;
        int sum3=0;
        int sum4=0;
        DateUtil date1=new DateUtil();
            if(isLeapYear(year)){
                mon_maxnum[2]=29;
                for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum=sum1+day;
            i=0;
            if(sum+n<=366){
                while(sum2+mon_maxnum[i]<sum+n){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum2);
            }
            else{
                while(sum4<sum+n){
                    if(isLeapYear(year)){
                        sum3+=366;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    else{
                         sum3+=365;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    year=year+1;
                }
                i=0;
                sum2=0;
                if(isLeapYear(year)) mon_maxnum[2]=29;
                else mon_maxnum[2]=28;
                while((sum2+mon_maxnum[i])<(sum+n-sum3)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum3-sum2);
            }
            }
        else{
            for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum=sum1+day;
            i=0;
            if(sum+n<=365){
                while(sum2+mon_maxnum[i]<sum+n){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum2);
            }
            else{
                while(sum4<sum+n){
                    if(isLeapYear(year)){
                        sum3+=366;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    else{
                         sum3+=365;
                        if(isLeapYear(year+1)){
                            sum4=sum3+366;
                        }
                        else sum4=sum3+365;
                    }
                    year=year+1;
                }
                i=0;
                sum2=0;
                if(isLeapYear(year)) mon_maxnum[2]=29;
                else mon_maxnum[2]=28;
                while((sum2+mon_maxnum[i])<(sum+n-sum3)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date1.setYear(year);
                date1.setMonth(i);
                date1.setDay(sum+n-sum3-sum2);
            }
        }
        return date1;
    }
    public DateUtil getPreviousNDays(int n){
        int i;
        int sum=0;
        int sum1=0;
        int sum2=0;
        int sum3=0;
        DateUtil date2=new DateUtil();
            if(isLeapYear(year)) mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
                for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum=sum1+day;
            i=0;
            if(n<sum){
                while((sum2+mon_maxnum[i])<(sum-n)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date2.setYear(year);
                date2.setMonth(i);
                date2.setDay(sum-n-sum2);
            }
            else{
                while(sum3<=(n-sum)){
                    if(isLeapYear(year-1)) sum3+=366;
                    else sum3+=365;
                    year=year-1;
                }
                i=0;
                sum2=0;
                if(isLeapYear(year)) mon_maxnum[2]=29;
                else mon_maxnum[2]=28;
                while((sum2+mon_maxnum[i])<(sum3-n+sum)){
                    sum2+=mon_maxnum[i];
                    i++;
                }
                date2.setYear(year);
                date2.setMonth(i);
                date2.setDay(sum3-n+sum-sum2);
            }
        return date2;
    }
    public boolean compareDates(DateUtil date){
        if(year<date.getYear()) return true;
        else if(year==date.getYear()){
            if(month<date.getMonth()) return true;
            else if(month==date.getMonth()){
                if(day<date.getDay()) return true;
                return false;
            }
            return false;
        }
        return false;
    }
public boolean equalTwoDates(DateUtil date){
        if(year==date.getYear()&&month==date.getMonth()&&day==date.getDay()) return true;
        else return false;
    }
     public int getDaysofDates(DateUtil date){
         int i,j,k;
         int sum0=0; int sum=0; int sum1=0; int sum2=0; int sum3=0; int sum4=0;
         if(isLeapYear(year)) mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
                for(i=0;i<month;i++){
                sum1+=mon_maxnum[i];
            }
            sum0=sum1+day;
         if(isLeapYear(date.getYear())) mon_maxnum[2]=29;
        else mon_maxnum[2]=28;
         for(j=0;j<date.getMonth();j++){
                sum2+=mon_maxnum[j];
            }
            sum=sum2+date.getDay();
        if(equalTwoDates(date)) return 0;
        else{
            if(compareDates(date)){
                if(year==date.getYear()) return(sum-sum0);
                else{
                        for(k=(year+1);k<date.getYear();k++){
                            if(isLeapYear(k)) sum3+=366;
                            else sum3+=365;
                        }
                         if(isLeapYear(year)) return(sum3+366-sum0+sum);
                         else return(sum3+365-sum0+sum);
                    }
            }
            else{
                if(year==date.getYear()) return(sum0-sum);
                else{
                        for(k=(date.getYear()+1);k<year;k++){
                            if(isLeapYear(k)) sum4+=366;
                            else sum4+=365;
                        }
                         if(isLeapYear(date.getYear())) return(sum4+366-sum+sum0);
                         else return(sum4+365-sum+sum0);
                    }
            }
        }
    }
    public String showDate(){
        String s=year+"-"+month+"-"+day;
        return s;
    }
}

我的类图:

 

 

分析解释与心得:

这一题让我感到有一些遗憾,我没能把它做到满分,原因是自己的懒惰和懈怠,虽然试了很多不同写法,但还是无济于事,这题在这四题是最难的,也是最花时间的。主方法已给出,要求我们写一些类方法,个人觉得计算两个日期之差是最简单的。难的是计算下n天的日期和计算前n天的日期。对于计算下n天日期我的想法是先算出一年的总天数,再判断该天数加上下n天是否会小于等于该年的天数,然后再用加上后的天数计算出日期。假如大于的话,那么就减去相应的年数,再计算日期,计算前n天日期也是类似的思路。

踩坑心得:

一开始我是使用这个代码的,这个代码十分复杂,让人做起来效率十分低,而且也比较难看懂,而且最大值测试点我一直过不了。然后我换了一种写法,就是下一天或前一天循环n次。小数据还能测试一下,但是数据十分大时运算就会超时。

改进建议:可以把算法改的更加简单,提高效率。

(3)总结:经过这几次题目集,我学到了基本数据类型、三种控制结构、字符串String的用法、StringBuilder的使用和类的构造方法和类方法的调用。以及锻炼了我的算法能力和逻辑思维,我觉得我要进一步学习后面的内容,和学习老师建议我们学习的内容。我的意见是老师能够给我们具体的方向,感觉很多时候都是盲目学习。