一道机试题 2018-4-18

题目大意是:写一个方法,入参是六个整数,组合成当天最小时间,如果数字组不起来就输出NOT PROSSIBLE。
大致写了一个可以基本实现功能的,后续有时间再改进。如果大家有好的建议,欢迎指导。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Kevin 2018-4-18
 * 实现内容:实现六个数字组合的最小時間
 * 记录:
 *  逻辑基本实现  
 *  算法待优化,60秒60分24时自增待处理
 * 
 * 
 * 
 * 
 *
 */
public class Solution {
	public static void main(String[] args) throws ParseException {
		String date = solution0(2,3,5,0,1,0);
		System.out.println("result:"+date);
	}
	
	 /**
	  * 
	  * 2018-4-18
	 * @param A
	 * @param B
	 * @param C
	 * @param D
	 * @param E
	 * @param F
	 * @return
	 * @throws ParseException 
	 */
	public static String solution0(int A, int B, int C, int D, int E, int F) throws ParseException {
        // write your code in Java SE 8
		 
		 int[] a = {A,B,C,D,E,F};
		 Map<String,String> hourMap = new HashMap<>();
		 Map<String,String> secondMap = new HashMap<>();
		 String doubleZero = "00";
		 for(int i=0;i<a.length;i++){
			 
			 for(int j=0;j<a.length;j++){
				 
				 if(i == j)
					 continue;
				 int m = Integer.valueOf(String.valueOf(a[i])+String.valueOf(a[j]));
				 if(m>=0 && m<=24){
					 String key = String.valueOf(i)+String.valueOf(j);
					 if(m==0){
						 hourMap.put(key, doubleZero);
					 } else if(m<10){
						 hourMap.put(key, "0"+String.valueOf(m));
					 } else {
						 hourMap.put(key, String.valueOf(m));
					 }
				 }
				 if(m<=59){//暂且不处理60问题
					 String key = String.valueOf(i)+String.valueOf(j);
					 if(m==0){
						 secondMap.put(key, doubleZero);
					 } else if(m < 10){
						 secondMap.put(key, "0"+String.valueOf(m));
					 } else {
						 secondMap.put(key, String.valueOf(m));
					 }
				 }
				 
			 }
		 }
		 
		 Set<String> dateSet = new HashSet<>();
		 for(String key : hourMap.keySet()){
			 
			 for(String key1 : secondMap.keySet()){
				 
				 if(key == key1)
					 continue;
				 String first = key.substring(0, 1);
				 String second = key.substring(1, 2);
				 if(key1.contains(first) || key1.contains(second)){
					continue; 
				 }else{
					 for(String key2 : secondMap.keySet()){
						 if(key1 == key2 || key == key2)
							 continue;
						 String first0 = key1.substring(0, 1);
						 String second0 = key1.substring(1, 2);
						 if(key2.contains(first0) || key2.contains(second0)
								 || key2.contains(first) || key2.contains(second)){
							continue; 
						 }else{
							 //TODO 60分 60秒 24时 待处理
							 dateSet.add("2018-4-18 "+hourMap.get(key) + ":" +secondMap.get(key1) +":" +secondMap.get(key2));
						 }
					 }
				 }
			 }
		 }
		 
		 if(dateSet.size() == 0){
			 return "NOT PROSSIBLE";
		 }
		 
		 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//		 Date zeroDate = sdf.parse("2018-4-18 00:00:00");//作为当天最小时间基准值
//		 System.out.println(zeroDate.getTime());
		 List<Long> l = new ArrayList<>();
		 for(String s : dateSet){
			 Date date = sdf.parse(s);
			 l.add(date.getTime());
		 }
		 
		 //升序排序
		 Collections.sort(l,new Comparator<Long>(){
			@Override
			public int compare(Long o1, Long o2) {
				return (int) (o1 - o2);
			}
		 });
		 
		 return sdf.format(new Date((Long)l.get(0)));
     }

}

改进:先利用一次排序获取到小时,如果不满足就抛错,满足就只进行剩余四个数字的组合来满足分钟和秒数

public class Solution {
	public static void main(String[] args) throws ParseException {
		
		//取到排序后的
		int[] a = getSortedArr(2,3,5,8,1,9);
		String hourStr = String.valueOf(a[0]) + String.valueOf(a[1]);
		if(Integer.valueOf(hourStr) > 24){//如果最小的都不能满足小时,那就只能抛错。
			System.out.println("NOT PROSSIBLE");
			return;
		}
		
		//思路就是:先排序,取最小的两位,来充当小时;然后再把剩余的四个数放进去组合出分钟和秒数,减少循环次数
		int[] hour = new int[2];
		hour[0] = a[0];
		hour[1] = a[1];
		
		int[] four = new int[4];
		four[0] = a[2];
		four[1] = a[3];
		four[2] = a[4];
		four[3] = a[5];
		String str = solution(hour,four);
		System.out.println(str);
		
	}
	
	
	 /**
	  * 
	  * 2018-4-19
	 * @param A
	 * @param B
	 * @param C
	 * @param D
	 * @param E
	 * @param F
	 * @return
	 * @throws ParseException 
	 */
	public static String solution(int[] hour, int[] four) throws ParseException {

		Map<String, String> secondMap = new HashMap<>();
		String doubleZero = "00";
		for (int i = 0; i < four.length; i++) {
			for (int j = 0; j < four.length; j++) {
				if (i == j)
					continue;
				int m = Integer.valueOf(String.valueOf(four[i]) + String.valueOf(four[j]));
				if (m <= 59) {// 暂且不处理60问题
					String key = String.valueOf(i) + String.valueOf(j);
					if (m == 0) {
						secondMap.put(key, doubleZero);
					} else if (m < 10) {
						secondMap.put(key, "0" + String.valueOf(m));
					} else {
						secondMap.put(key, String.valueOf(m));
					}
				}
			}
		}

		Set<String> dateSet = new HashSet<>();
		for (String key1 : secondMap.keySet()) {

			for (String key2 : secondMap.keySet()) {
				if (key1 == key2)
					continue;
				String first0 = key1.substring(0, 1);
				String second0 = key1.substring(1, 2);
				if (key2.contains(first0) || key2.contains(second0)) {
					continue;
				} else {
					// TODO 60分 60秒 24时 待处理
					dateSet.add(
							"2018-4-18 " + hour[0] + hour[1] + ":" + secondMap.get(key1) + ":" + secondMap.get(key2));
				}
			}
		}

		if (dateSet.size() == 0) {
			return "NOT PROSSIBLE";
		}

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// Date zeroDate = sdf.parse("2018-4-18 00:00:00");//作为当天最小时间基准值
		// System.out.println(zeroDate.getTime());
		List<Long> l = new ArrayList<>();
		for (String s : dateSet) {
			Date date = sdf.parse(s);
			l.add(date.getTime());
		}

		// 升序排序
		Collections.sort(l, new Comparator<Long>() {
			@Override
			public int compare(Long o1, Long o2) {
				return (int) (o1 - o2);
			}
		});

		return sdf.format(new Date((Long) l.get(0)));
	}


	public static int[] getSortedArr(int A, int B, int C, int D, int E, int F){
		int[] arr = {A,B,C,D,E,F};
		
		int temp;//临时变量
	     for(int i=0; i<arr.length-1; i++){   //表示趟数,一共arr.length-1次。
	         for(int j=arr.length-1; j>i; j--){
	             if(arr[j] < arr[j-1]){
	                 temp = arr[j];
	                 arr[j] = arr[j-1];
	                 arr[j-1] = temp;
	             }
	         }
	     }
 
		return arr;
	}

}

结果:

old method循环了:1040次。
result:2018-04-18 12:38:59

firts sort count :15
new method循环了:56次。
2018-04-18 12:38:59

明显少了很多循环次数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值