微信小程序可以做音乐网站吗seo快速排名上首页
1、枚举所有数值进行日期判断
时间复杂度是o(n)的,比较慢,单实例能凑合用,多实例的话时间复杂度有点高。
核心代码就是判断某个八位数能否表示一个日期。
static int[] month = {0,31,28,31,30,31,30,31,31,30,31,30,31};static String a, b; static void sovle() throws Exception {b = br.readLine();int s = 0;int l = Integer.parseInt(a), r = Integer.parseInt(b);for(int i = l; i <= r; i ++) if(check(i))s ++;bw.write(s + "\n");}private static boolean check(int i) {int a = i / 10000, b = i / 100 % 100, c = i % 100;if(b < 1 || b > 12 || c < 1) return false;if(b == 2 && asd(a)) return c <= 29;return c <= month[b];}private static boolean asd(int a) {return a % 400 == 0 || a % 4 == 0 && a % 100 != 0;} public static void main(String args[]) throws Exception {
// int t = Integer.parseInt(br.readLine());int t = 1;while((a = br.readLine()) != null) {sovle();}bw.flush();bw.close();}
2、模拟日期的加法
时间复杂度为o(n),比第一个方法稍微快一点,但是这里的n是合法日期的数量。
static int[] month = {0, 31,28,31,30,31,30,31,31,30,31,30,31};static String a, b;static void sovle() throws Exception {b = br.readLine();int s = 0;int l = Integer.parseInt(a), r = Integer.parseInt(b);while(l <= r) {s ++;l = ne(l);}bw.write(s + "\n");}private static int ne(int i) {i = i + 1;int a = i / 10000, b = i / 100 % 100, c = i % 100;if(b == 2 && asd(a)) {if(c > 29) {b = 3;c = 1;}} else {if(c > month[b]) {b ++;c = 1;}}if(b == 13) {a ++;b = 1;}return a * 10000 + b * 100 + c;}private static boolean asd(int a) {return a % 400 == 0 || a % 4 == 0 && a % 100 != 0;}public static void main(String args[]) throws Exception {
// int t = Integer.parseInt(br.readLine());int t = 1;while((a = br.readLine()) != null) {sovle();}bw.flush();bw.close();}
3、枚举整年、整月
时间复杂度是 o(n),这里的n是年份,最高才10000;时间是最快的,基本可以满足所有情况下的使用。
static int[] month = {0, 31,28,31,30,31,30,31,31,30,31,30,31};static String a, b; static void sovle() throws Exception {b = br.readLine();int s = 0;int l = Integer.parseInt(a), r = Integer.parseInt(b);if(l > r) {int a = l;l = r;r = a;}s = get(l, r);bw.write(s + "\n");}private static int get(int l, int r) {int s = 0;int a1 = l / 10000, b1 = l / 100 % 100, c1 = l % 100;int a2 = r / 10000, b2 = r / 100 % 100, c2 = r % 100;for(int i = a1; i < a2; i ++) {if(asd(i)) s += 366;else s += 365;}for(int i = 1; i < b2; i ++) {s += month[i];if(i == 2 && asd(a2)) s ++;}s += c2;for(int i = 1; i < b1; i ++) {s -= month[i];if(i == 2 && asd(a1)) s --;}s -= c1;s += 1;return s;}private static boolean asd(int a) {return a % 400 == 0 || a % 4 == 0 && a % 100 != 0;}public static void main(String args[]) throws Exception {
// int t = Integer.parseInt(br.readLine());int t = 1;while((a = br.readLine()) != null) {sovle();}bw.flush();bw.close();}