一道机试题 2018-4-18

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kevin_King1992/article/details/80000033

题目大意是:写一个方法,入参是六个整数,组合成当天最小时间,如果数字组不起来就输出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

明显少了很多循环次数

猜你喜欢

转载自blog.csdn.net/Kevin_King1992/article/details/80000033