zoukankan      html  css  js  c++  java
  • 一道机试题 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

    明显少了很多循环次数

  • 相关阅读:
    JAVA_NIO 与Netty框架
    Socket编程
    P3368树状数组2(树状数组//改段求点)
    P3373 树状数组1(树状数组//改点求段)
    树状数组
    P1197 星球大战(并查集+链式向前星)
    P2024 食物链(种类并查集||带权并查集)
    P1111 修复公路(kruscal+并查集)
    P1387 最大正方形+P1736 创意吃鱼法(矩形上的dp+预处理)
    P2330 繁忙的城市(krusal最小生成树)
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608364.html
Copyright © 2011-2022 走看看