最近最小天数日期计算,程序有问题~


人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目。海盗旗下方的电子屏显示的日期形式为 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));
      }
    }
} 


 

提交后,提示测试数据未通过。不知道是哪里出了问题。

求高手指点~~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值