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

    明显少了很多循环次数

  • 相关阅读:
    Python中所有的关键字
    关于selenium的8种元素定位
    对提示框的操作
    selenium+webservice进行百度登录
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled...报错解决
    Vue中使用echarts
    npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142解决方法
    插入排序
    冒泡排序优化
    roject 'org.springframework.boot:spring-boot-starter-parent:XXX' not found 解决
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608364.html
Copyright © 2011-2022 走看看