人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目。海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位、月份占 2 位、天数占 2 位)。
日期电子屏幕上每个数字对应的显示如下图:
从上图可以得知每个数字对应的笔画数,比如 2 的笔画数是 5,8 的笔画数是 7,等等。人人员工小明看到了项目的启动日期 d,但是项目的结束日期没看清楚,只知道电子屏幕上项目结束日期所需的笔画数为 m,你能帮小明算出来项目执行所用的时间天数么?
输入格式
输入数据有多组。第一行输入一个整数 T (1 ≤ T ≤ 20),表示一共有 T 组数据。
接下来每组数据 2 行,共 T * 2 行。每组第一行输入一个长度为 8 的仅包含数字的字符串 d,表示项目的启动日期,形式为 YYYYMMDD。每组第二行输入一个非负整数 m (0 ≤ m ≤ 100),表示电子屏幕上项目结束日期所需的笔画数。输入日期保证合法。
输出格式
一共输出 T 行,每行一个整数,表示该组数据对应的项目执行所用的时间天数。如果最近的符合要求的结束日期超过 2999 年 12 月 31 日或无解则输出 -1,否则输出符合要求的最小的解。
样例1
输入:
2
20150718
30
29991231
38
输出:
85
-1
我的解题思路是,从当前日期开始,一天天累加,直到日期笔画为目标值。
优化就是事先给出一定不可能的值。
java代码:
<pre name="code" class="java">import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static int countNumber(String fir, Map<String, Integer> map){
int count = 0;
for(int i = 0; i < fir.length(); ++i) {
count += map.get("" + fir.charAt(i));
}
return count;
}
public static int daysBetween(String smdate,String bdate) throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd");
Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(smdate));
long time1 = cal.getTimeInMillis();
cal.setTime(sdf.parse(bdate));
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
public static String addOneDay(String startdate) throws ParseException {
Date date = (new SimpleDateFormat("yyyyMMdd")).parse(startdate);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, 1);
return (new SimpleDateFormat("yyyyMMdd")).format(cal.getTime()).toString();
}
public static int countDay(String data, int day, Map<String, Integer> map) throws ParseException{
int year = Integer.parseInt(data.substring(0, 4));
String tempDay = data;
while (year <= 2999) {
tempDay = addOneDay(tempDay);
year = Integer.parseInt(tempDay.substring(0, 4));
if (countNumber(tempDay, map) == day) {
return daysBetween(data, tempDay);
}
}
return -1;
}
public static void main(String[] args) throws ParseException{
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("0", 6);
map.put("1", 2);map.put("2", 5);map.put("3", 5);
map.put("4", 4);map.put("5", 5);map.put("6", 6);
map.put("7", 3);map.put("8", 7);map.put("9", 6);
Scanner sc = new Scanner(System.in);
List<Integer> res = new ArrayList<Integer>();
int num = sc.nextInt();
for(int i = 0; i < num; ++i) {
int data = sc.nextInt();
int day = sc.nextInt();
if (day > 52)
res.add(-1);
else
res.add(countDay("" + data, day, map));
}
for(int i = 0; i < res.size(); ++i) {
System.out.println(res.get(i));
}
}
}
提交后,提示测试数据未通过。不知道是哪里出了问题。
求高手指点~~