zoukankan      html  css  js  c++  java
  • [GeeksForGeeks] Find Maximum Number that can be formed using given all digits in a given integer.

    Find Maximum Number that can be formed using all digits in the given integer.

    Solution 1. O(n * log n) runtime, O(n) space using sorting

    A simple solution is to create an array of size n, n is the total number of digits. 

    1. Fill in the array in O(n) time.

    2. Sort the array in descending order in O(n * log n) time. 

    3. construct a new number in O(n) time.

    Solution 2. O(n) runtime, O(1) space 

    Since we know all digits are in between 0 and 9, we can use O(1) space to get a mapping 

    from each digit in [0, 9] and its appearance number in the given integer. 

    Then in O(n) time, we reconstruct the max number by traversing the mapping from 9 to 0.

     1 public class MaxNum {
     2     public int getMaxNum(int val) {
     3         int[] map = new int[10];
     4         int modulous = 0; int max = 0;
     5         while(val != 0) {
     6             modulous = val % 10;
     7             map[modulous]++;
     8             val /= 10;
     9         }
    10         for(int i = 9; i >= 0; i--) {
    11             while(map[i] != 0) {
    12                 max = max * 10 + i;    
    13                 map[i]--;
    14             }                
    15         }
    16         return max;
    17     }
    18 }

     Follow up question: Instead of given an integer, you are now given some strings, each string contains some number of digits. 

    What is the max number you can get out of these strings? You are allowed to combine the strings in different order, but you can't 

    change each individual string.

    The key of this problem is to sort the input strings in a way that we can reconstruct the string with the max value by a linear scan. 

    For strings that have the same length, we follow strings' natural ordering. In the case of different lengths' strings, the following

    orders are used.

    We pad the shorter string using its last character to be the same length of the longer string. 

    For example,

    to compare "33" and "332",  we compare "333" and "332", so "33" is bigger than "332";

    to compare "33" and "333",  we compare "333" and "333", so "33" is equal to "333";

    to compare "33" and "334",  we compare "333" and "334", so "33" is smaller than "334";

     1 public String getMaxNumStr(String[] strs) {
     2     Comparator<String> comp = new Comparator<String>() {
     3         public int compare(String s1, String s2) {
     4             int idx1 = 0, idx2 = 0;
     5             while(idx1 < s1.length() && idx2 < s2.length()) {
     6                 if(s1.charAt(idx1) < s2.charAt(idx2)) {
     7                     return 1;
     8                 }
     9                 else if(s1.charAt(idx1) > s2.charAt(idx2)) {
    10                     return -1;
    11                 }
    12                 idx1++;
    13                 idx2++;
    14             }
    15             if(idx1 == s1.length() && idx2 == s2.length()) {
    16                 return 0;
    17             }
    18             else if(idx1 < s1.length()) {
    19                 while(idx1 < s1.length()) {
    20                     if(s1.charAt(idx1) < s2.charAt(s2.length() - 1)) {
    21                         return 1;
    22                     }
    23                     else if(s1.charAt(idx1) > s2.charAt(s2.length() - 1)) {
    24                         return -1;
    25                     }
    26                     idx1++;
    27                 }
    28             }
    29             else {
    30                 while(idx2 < s2.length()) {
    31                     if(s1.charAt(s1.length() - 1) < s2.charAt(idx2)) {
    32                         return 1;
    33                     }
    34                     else if(s1.charAt(s1.length() - 1) > s2.charAt(idx2)) {
    35                         return -1;
    36                     }
    37                     idx2++;
    38                 }                    
    39             }
    40             return 0;
    41         }
    42         
    43     };
    44     Arrays.sort(strs, comp);
    45     StringBuilder sb = new StringBuilder();
    46     for(int i = 0; i < strs.length; i++) {
    47         sb.append(strs[i]);
    48     }
    49     return sb.toString();
    50 }
  • 相关阅读:
    基于Maven的MyBatis Generator逆向工程
    JQuery对象调用reset方法:Uncaught TypeError: $(...).reset is not a function
    死锁编码及定位分析
    线程池的简介及底层原理
    转载:Mysql8.0忘记 root 密码, 如何修改?
    synchronized 和 Lock 有什么区别?
    java 中的阻塞队列及生产者-消费者中的简单应用
    java 中 CountDownLatch、CyclicBarrier 和 Semaphore 的简单使用
    java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁
    Java 集合类的线程安全问题及解决方法
  • 原文地址:https://www.cnblogs.com/lz87/p/7407507.html
Copyright © 2011-2022 走看看