算法練習(24):日期類設計(1.2.11-1.2.12)

本系列博客習題來自《算法(第四版)》反镇,算是本人的讀書筆記,如果有人在讀這本書的娘汞,歡迎大家多多交流歹茶。為了方便討論,本人新建了一個微信群(算法交流)你弦,想要加入的惊豺,請?zhí)砑游业奈⑿盘枺簔hujinhui207407 謝謝。另外禽作,本人的個人博客 http://www.kyson.cn 也在不停的更新中尸昧,歡迎一起討論

算法(第4版)

知識點

  • 日期類的設計
  • 異常處理
  • 蔡勒公式

題目

1.2.11 根據Date的API實現一個SmartDate類型,在日期非法時拋出一個異常旷偿。


1.2.11 Develop an implementation SmartDate of our Date API that raises an excep- tion if the date is not legal.

答案

分析

本人所有簡書的算法文章詳細分析已經移入小專欄:算法四習題詳解烹俗,歡迎大家訂閱

public class SmartDate {
    
    @SuppressWarnings("unused")
    private final int year;
    @SuppressWarnings("unused")
    private final int month;
    @SuppressWarnings("unused")
    private final int day;
    
    public SmartDate(int year,int month,int day) throws Exception {
        if (year < 0 || month < 0 || day < 0) {
            Exception exception = new Exception("年月日要大于0");
            throw exception;
        }
        if (month > 12) {
            Exception exception = new Exception("年份要小于等于12");
            throw exception;
        }
        
        switch (month) {
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        case 1:{
            if (day > 31) {
                Exception exception = new Exception(month + "月小于31號");
                throw exception;
            }
        }
            break;
        case 2:{
            if (day > 29) {
                Exception exception = new Exception(month + "月小于31號");
                throw exception;
            }
            
            int leapYear = year % 4;
            if (leapYear != 0) {
                if (day > 28) {
                    Exception exception = new Exception(month + "月小于29號");
                    throw exception;
                }
            }
            
        }
            break;
        case 4:
        case 6:
        case 9:
        case 11:{
            if (day > 30) {
                Exception exception = new Exception(month + "月小于30號");
                throw exception;
            }
        }
            break;
            

        default:
            break;
        }
        

        
        this.day    = day;
        this.year   = year;
        this.month  = month;
    }
    

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        SmartDate date = new SmartDate(2007, 1, 50);
    }

}

代碼索引

SmartDate1.java

視頻講解

點此觀看分析視頻

題目

1.2.12 為SmartDate添加一個方法dayOfTheWeek()爆侣,為日期中每周的日返回Monday、Tuesday幢妄、Wednesday兔仰、Thursday……假定是21世紀


1.2.12 Add a method dayOfTheWeek() to SmartDate that returns a String value Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, or Sunday, giving the ap- propriate day of the week for the date. You may assume that the date is in the 21st century.

答案

public class SmartDate2 {

    @SuppressWarnings("unused")
    private final int year;
    @SuppressWarnings("unused")
    private final int month;
    @SuppressWarnings("unused")
    private final int day;
    
    private static final int YEARFIRSTTWO = 20;
    private static final int DAYPERWEEK = 7;

    public SmartDate2(int year, int month, int day) throws Exception {
        if (year < 0 || month < 0 || day < 0) {
            Exception exception = new Exception("年月日要大于0");
            throw exception;
        }
        if (month > 12) {
            Exception exception = new Exception("年份要小于等于12");
            throw exception;
        }

        switch (month) {
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        case 1: {
            if (day > 31) {
                Exception exception = new Exception(month + "月小于31號");
                throw exception;
            }
        }
            break;
        case 2: {
            if (day > 29) {
                Exception exception = new Exception(month + "月小于31號");
                throw exception;
            }

            int leapYear = year % 4;
            if (leapYear != 0) {
                if (day > 28) {
                    Exception exception = new Exception(month + "月小于29號");
                    throw exception;
                }
            }

        }
            break;
        case 4:
        case 6:
        case 9:
        case 11: {
            if (day > 30) {
                Exception exception = new Exception(month + "月小于30號");
                throw exception;
            }
        }
            break;

        default:
            break;
        }

        this.day = day;
        this.year = year;
        this.month = month;
    }
    
    public String dayOfTheWeek(){
        String resultWeek = "";
        int tempMonth = this.month;
        int tempYear = this.year;
        int tempDay = this.day;
        if (this.month == 1 || this.month == 2) {
            tempMonth += 12;
            tempYear --;
        }
        
        int y = tempYear - YEARFIRSTTWO * 100;
        int floor1 = (int) Math.floor(y/4);
        int floor2 = (int) (YEARFIRSTTWO / 4);
        int floor3 = (int) Math.floor(26 * (tempMonth+1)/10);
        
        int w = y + floor1 + floor2 -2 * YEARFIRSTTWO + floor3 + tempDay - 1;
        int key = w % DAYPERWEEK;
        
        if (key <0) {
            key = key + 7;
        }
        
        
        switch (key) {
        case 0:
            resultWeek = "星期日";
            break;
        case 1:
            resultWeek = "星期一";
            break;
        case 2:
            resultWeek = "星期二";
            break;
        case 3:
            resultWeek = "星期三";
            break;
        case 4:
            resultWeek = "星期四";
            break;
        case 5:
            resultWeek = "星期五";
            break;
        case 6:
            resultWeek = "星期六";
            break;

        default:
            break;
        }
        
        return resultWeek;
    }
    
    public String toString(){
        
        return ""+ month + "/" + day + "/" + year;
    }

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        SmartDate2 date = new SmartDate2(2012, 2, 28);
        String week = date.dayOfTheWeek();
        System.out.println( date + " is :" + week);
    }

}

代碼索引

SmartDate2.java

視頻講解

點此觀看分析視頻

注意

這里的SmartDate1,SmartDate2蕉鸳,實現還不夠完善乎赴,會在下一篇文章
算法練習(25):Transaction(1.2.13-1.2.14)中進行更改。

廣告

我的首款個人開發(fā)的APP壁紙寶貝上線了潮尝,歡迎大家下載榕吼。

本人所有簡書的算法文章已經移入小專欄:算法四習題詳解,歡迎大家訂閱

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末衍锚,一起剝皮案震驚了整個濱河市友题,隨后出現的幾起案子,更是在濱河造成了極大的恐慌戴质,老刑警劉巖度宦,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異告匠,居然都是意外死亡戈抄,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門后专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來划鸽,“玉大人,你說我怎么就攤上這事戚哎÷惴蹋” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵型凳,是天一觀的道長丈冬。 經常有香客問我,道長甘畅,這世上最難降的妖魔是什么埂蕊? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮疏唾,結果婚禮上蓄氧,老公的妹妹穿的比我還像新娘。我一直安慰自己槐脏,他們只是感情好喉童,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顿天,像睡著了一般泄朴。 火紅的嫁衣襯著肌膚如雪重抖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天祖灰,我揣著相機與錄音钟沛,去河邊找鬼。 笑死局扶,一個胖子當著我的面吹牛恨统,可吹牛的內容都是我干的。 我是一名探鬼主播三妈,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼畜埋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了畴蒲?” 一聲冷哼從身側響起悠鞍,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎模燥,沒想到半個月后咖祭,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蔫骂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年么翰,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辽旋。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浩嫌,死狀恐怖,靈堂內的尸體忽然破棺而出补胚,到底是詐尸還是另有隱情码耐,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布溶其,位于F島的核電站骚腥,受9級特大地震影響,放射性物質發(fā)生泄漏握联。R本人自食惡果不足惜桦沉,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一每瞒、第九天 我趴在偏房一處隱蔽的房頂上張望金闽。 院中可真熱鬧,春花似錦剿骨、人聲如沸代芜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤庇。三九已至钞速,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫡秕,已是汗流浹背渴语。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昆咽,地道東北人驾凶。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像掷酗,于是被迫代替她去往敵國和親调违。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容