• 算法-第四版-练习1.2.12解答


    为SmartDate添加一个方法dayOfTheWeek(),为日期中每周的日返回Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday中的适当值。你可以假定时间是21世纪。


    /**
     * Description : 
     * Author      : mn@furzoom.com
     * Date        : Sep 27, 2016 9:45:00 AM
     * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
     */
    package com.furzoom.lab.algs.ch102;
    
    class SmartDate
    {
        private final int month;
        private final int day;
        private final int year;
        private final int[] months = 
            {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        private final int[] days = 
            {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
        private final int[] daysLeap =  
            {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
        private final String[] weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday", 
                "Thursday", "Friday", "Saturday"};
        
        public SmartDate(int m, int d, int y)
        {
            if (!validate(m, d, y))
                throw new IllegalArgumentException("Argument illegal " + m + "/" + d + "/" + y);
            this.month = m;
            this.day = d;
            this.year = y;
        }
        
        public int month()
        {
            return month;
        }
        
        public int day()
        {
            return day;
        }
        
        public int year()
        {
            return year;
        }
        
        public String dayOfTheWeek()
        {
            // based on 1/1/2000
            int totalDays;
            if (isLeapYear())
            {
                totalDays = daysLeap[month] + day;
            }
            else
            {
                totalDays = days[month] + day;
            }
            
            for (int i = 2000; i < year; i++)
            {
                if (isLeapYear(i))
                    totalDays += 366;
                else
                    totalDays += 365;
            }
            
            // 1/1/2000 is Saturday
            return weekdays[((totalDays - 1) % 7 + 6) % 7];
        }
        
        public String toString()
        {
            return month + "/" + day + "/" + year;
        }
        
        private boolean validate(int m, int d, int y)
        {
            if (y == 0 || y < -1000 || y > 10000)
                return false;
            
            if (m < 1 || m > 12)
                return false;
            
            if (d < 1 || d > 31)
                return false;
            
            if (d > months[m])
                return false;
            
            if (!isLeapYear() && d > 28)
                return false;
            
            return true;
        }
        
        private boolean isLeapYear(int y)
        {
            if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        
        private boolean isLeapYear()
        {
            return isLeapYear(year);
        }
    }

    测试:

    /**
     * Description : 
     * Author      : mn@furzoom.com
     * Date        : Sep 27, 2016 9:42:39 AM
     * Copyright (c) 2013-2016, http://furzoom.com All Rights Reserved.
     */
    package com.furzoom.lab.algs.ch102;
    
    /**
     * ClassName    : E10212 <br>
     * Function     : TODO ADD FUNCTION. <br>
     * date         : Sep 27, 2016 9:42:39 AM <br>
     * 
     * @version 
     */
    public class E10212
    {
        public static void main(String[] args)
        {
            SmartDate date = new SmartDate(1, 1, 2000);
            System.out.println(date + " " + date.dayOfTheWeek());
            
            date = new SmartDate(2, 1, 2000);
            System.out.println(date + " " + date.dayOfTheWeek());
            
            date = new SmartDate(12, 29, 2000);
            System.out.println(date + " " + date.dayOfTheWeek());
            
            date = new SmartDate(12, 29, 2010);
            System.out.println(date + " " + date.dayOfTheWeek());
        }
    
    }
    

    结果:

    1/1/2000 Saturday
    2/1/2000 Tuesday
    12/29/2000 Friday
    12/29/2010 Wednesday
    


    算法-第四版-1.2 数据抽象-习题索引汇总

    算法-第四版习题索引汇总

  • 相关阅读:
    11.正则表达式的一些简单应用
    10.JavaScript距离生日还有多少天、根据出生年月日计算年龄、打印当前月份每天的星期
    9.JavaScript获取当前时间,返回格式年-月-日 时:分:秒
    8.JavaScript获取一个从最小值到最大值的随机数
    7.JavaScript数组乱序排序
    6.JavaScript中的new.target
    5.JavaScript自定义数组排序
    2-9 随机模块
    2-8 四则运算
    1-22Python练习题1-1
  • 原文地址:https://www.cnblogs.com/furzoom/p/7710217.html
Copyright © 2020-2023  润新知