题解 | #永远有多远#
永远有多远
http://www.nowcoder.com/questionTerminal/6e0db09b8ea743c9811f85083562da56
public class Solution { int mon[] = new int[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; boolean isYear(int year){ if((year%4==0&&year%100!=0)||year%400==0)return true; return false; } boolean check(int y1, int m1, int d1, int y2, int m2, int d2){ if(y2<y1) return false; else if(y1 == y2 && m2 <m1) return false; else if(y1 == y2 && m2 ==m1 && d2<d1) return false; return true; } public int workdays_between (int y1, int m1, int d1, int y2, int m2, int d2) { // write code here if(!check(y1, m1, d1, y2, m2, d2))return 0; long days = 0; for (int i = 1; i < y1; i++) { if(isYear(i))days+=366; else days+=365; } for (int i = 1; i < m1; i++) { if(i==2&&isYear(y1))days+=29; else days+=mon[i]; } days+=d1; long res = 0; if(y2>y1){ for (int i = y1+1; i < y2; i++) { if(isYear(i))res+=366; else res+=365; } if(m1 == 2&&isYear(y1)) res += 29 - d1; else res += mon[m1]-d1; for (int i = m1+1; i <= 12 ; i++) { if(i==2&&isYear(y1))res+=29; else res+=mon[i]; } for (int i = 1; i < m2 ; i++) { if(i==2&&isYear(y2))res+=29; else res+=mon[i]; } res += d2; }else { if(m2>m1){ if(m1 == 2&&isYear(y1)) res += 29 - d1; else res += mon[m1]-d1; for (int i = m1+1; i < m2; i++) { if(i==2&&isYear(y1))res+=29; else res+=mon[i]; } res += d2; }else{ res += d2 -d1; } } int ans = 0; int w =(int) days%7; //System.out.println(w+" "+isYear(2016)+" "+res); int r =0; if(w!=1){ if(w==0) r = 1; else r = 7 - w + 1; } if(res>=r){ if(w!=1&&r>=2) ans += r - 2; res -= r; ans += res - (res/7)*2 ; if(res%7>5)ans-=1; }else { int t = 6-w; if(t>=res) ans+=res; else ans +=t; } return ans; } }