![]() |
||
Major Member
![]() 加入日期: Aug 2005
文章: 237
|
板上的Java高手請教,勞工新制的工時計算
假設某月份,31天,每天的工時,如下面的陣列,
6.5表示當天上班6.5小時,0表示當天休假。 {6.5,9,6.5,9.5,6.5,6.5,0,6.5,6.5,6.5,6,9.5,6.5,0,6.5,9,6.5,6,6.5,0,6.5,6.5,6.5,6.5,6.5,6.5,0,6.5,0,0,0} 條件: 一、7休1 二、14休2 三、7天內的工時合計不可超過48小時 四、14天內的工時合計不可超過80小時,若超過時顯示加班幾個小時 請問Java要怎麼寫,才能檢查上面的陣列是否符合,若不符合,請顯示哪天到哪天不符合,感謝!!!
__________________
"拋磚引玉"大家來談談,你用過免費又好用的程式 |
|||||||
![]() |
![]() |
Elite Member
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
![]() 如果是我, 會考慮OOD來降低複雜度...
在我看來你提供的條件都是策略.. 應該用STRATEGY來拆開算法(先不去管要不要合併TEMPLATE METHOD, 我沒有注意到有特別的流程)... 連續檢查的情況下可以做成一條chain... 可以把職責做成Responsibility of chain連續傳遞... 我不希望充斥著一大堆的if/else或著switch, ugly code. terrible... 免不了一定會有factory的設計來操作... 也許思考上我可能還有些缺失... 當然, 可以裝B應用結構化程序方式慢慢折騰... 此文章於 2016-12-25 11:07 PM 被 vxr 編輯. |
||
![]() |
![]() |
Major Member
![]() 加入日期: Aug 2005
文章: 237
|
引用:
你說的那些,我只會用if/else來處理,其他的我都不懂。 我是想說,先檢查條件1(7休1),若不符合,就顯示哪裡不符合。 然後再檢查條件2,以此類推。 我大概只會最簡單的方式。
__________________
"拋磚引玉"大家來談談,你用過免費又好用的程式 |
|
![]() |
![]() |
Elite Member
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
![]() 引用:
這個結構化程序的設計顯然缺失就是大量的條件判斷... 如果對OOAD很生疏, 結構化程序設計不是不行... 只是我覺得代碼會變得相當複雜.... 你是否有接觸過一些OO的基本原則??.. 比方說有一個叫 "駱駝特馬的" 這個王八創造了SOLID-5大原則... 雖然像是駱駝特馬的或著馬的發拉(這個傢伙特別混帳... ![]() 此文章於 2016-12-25 11:22 PM 被 vxr 編輯. |
|
![]() |
![]() |
Major Member
![]() 加入日期: Aug 2005
文章: 237
|
引用:
那能否教我條件1的7休1,用IF的方式,剩下我自己慢慢摸索,謝謝!
__________________
"拋磚引玉"大家來談談,你用過免費又好用的程式 |
|
![]() |
![]() |
Senior Member
![]() ![]() ![]() 加入日期: Jun 2002
文章: 1,464
|
以1來說笨蛋一點不就對數列做index
直接loop 31(n=1:31)次,或是根據數列長度做變化 每次loop (0+n)~(6+n),取出相對應的數列 再對這7個數字尋找0出現次數 0次的話就輸出date(n)~date(6+n) 相對應的日期 我應該沒誤會樓主的意思吧@@ 此文章於 2016-12-26 12:24 AM 被 whatsnew 編輯. |
![]() |
![]() |
Major Member
![]() 加入日期: Aug 2001
文章: 211
|
我覺得先針對要解決的問題寫 code,比為了 DP 而 DP 好。
樓主現在問題的重點是算法,不是設計。 我覺得這種小東西用到 strategy 就已經是在用牛刀殺雞了,再加 factory 感覺就像拿電鋸了,如果你有一兩百隻雞要殺,這是不錯的選擇。 可是我覺得樓主不過就只想殺一隻雞而已... ![]() ![]() ![]() ![]() ![]()
__________________
滿招損 謙受益 |
![]() |
![]() |
Regular Member
![]() ![]() 加入日期: Feb 2005
文章: 71
|
![]() int flag = 1;
for(int i = 0; i < 30; i++, flag++){ if(array[n] == 0){ flag = 0; } if(flag > 6){ System.out.println("第" + (n+1) + "天不符合"); } } 此文章於 2016-12-26 01:10 AM 被 classspeed 編輯. |
![]() |
![]() |
Elite Member
加入日期: May 2002 您的住址: 地球的上面..
文章: 5,854
|
![]() 引用:
如果條件一的問題.. 我的想法是這樣... 我猜你的問題是抽出來看是否符合7休一天的條件... 假設你休的日子是固定的 比方說修星期日=7.. 迴圈用餘數去算然後抽出來檢查.. 但是我覺得這方法不好.. 因為迴圈次數大... 可以的話用倍數去算... 迴圈次數將會大幅減少... 否則你要慢慢loop到31次嗎?... 我不清楚你對Java的熟悉程度, 你可以建立一個class.. 然後宣告一個公開的委派... 因為委派是方法的pointer, 還可以形成chain..... 然後在裡面填入相關的算法... 再來....!@#$%^&*( 好吧! darkangel老兄說的... 用牛刀殺雞, forget it!!!.... 此文章於 2016-12-26 01:23 AM 被 vxr 編輯. |
|
![]() |
![]() |
Major Member
![]() 加入日期: Aug 2001
文章: 211
|
引用:
一般 i++ loop 的時間複雜度是 O(n),而像這種迴圈最大值很小(<100)的狀況下通常會比用倍數迴圈的 O(log n) 快。 另外,不應該在這裡考慮效能問題,瓶頸不太可能會出現在這。 以我n年的實務經驗,我覺得設計時有兩個重點,分享一下: 1. 不要過度設計 2. 不要在設計時考慮效能問題,不然容易失去重點 我不熟 java,不然我給的答案應該也是 loop + if/else。
__________________
滿招損 謙受益 此文章於 2016-12-26 02:11 AM 被 darkangel 編輯. |
|
![]() |
![]() |