zoukankan      html  css  js  c++  java
  • leetcode 179. Largest Number 求最大组合数 ---------- java

    Given a list of non negative integers, arrange them such that they form the largest number.

    For example, given [3, 30, 34, 5, 9], the largest formed number is 9534330.

    Note: The result may be very large, so you need to return a string instead of an integer.

    给一组数,求这一组数的最大组合。

    刚开始想用直接排序的方法:1、最高位较大的放在前面

    2、但是就出现了54与5这种情况,那么进一步判断。

    3、然后又出现了121与12的情况,就越写越复杂。也没有写对。

    public class Solution {
        public String largestNumber(int[] nums) {
            System.out.println(compare(121,12));
            StringBuffer str = new StringBuffer();
            sort(nums, 0, nums.length - 1);
            for (int i = nums.length - 1;i >= 0; i--){
                System.out.print(nums[i]+" ");
                str.append(nums[i]);
            }
            return str.toString();
        }
        private void sort(int[] nums, int left, int right){
            if (left >= right){
                return ;
            }
            int start = left;
            int end = right;
            int flag = nums[left];
            while (left < right){
                while (right > left && compare(flag, nums[right]) == -1){
                    right--;
                }
                if (left == right){
                    break;
                } else {
                    nums[left] = nums[right];
                    nums[right] = flag;
                    left++;
                }
                while (right > left && compare(nums[left],flag) == -1){
                    left++;
                }
                if (left == right){
                    break;
                } else {
                    nums[right] = nums[left];
                    nums[left] = flag;
                    right--;
                }
                
            }
            for( int i = 0;i < nums.length; i++)
                System.out.print(nums[i]+" ");
            System.out.println();
            sort(nums, start, left - 1);
            sort(nums, right + 1, end);
        }
        private int compare(int num1, int num2){
            double num1_copy = num1;
            double num2_copy = num2;
            while (num1_copy >= 10){
                num1_copy = num1_copy / 10;
            }
            while (num2_copy >= 10){
                num2_copy = num2_copy / 10;
            }
            if ((int) num1_copy % 10 > (int) num2_copy % 10){
                return 1;
            } else if ((int) num1_copy % 10 < (int) num2_copy % 10){
                return -1;
            } else {
                int flag = (int) num1_copy % 10;
                while ((int) num1_copy % 10 == (int) num2_copy % 10 && (int) num1_copy != 0 && (int) num2_copy != 0){
                    flag = (int) num1_copy % 10;
                    num1_copy = num1_copy * 10 - ((int) num1_copy % 10) * 10;
                    num2_copy = num2_copy * 10 - ((int) num2_copy % 10) * 10;
                }
                System.out.println(num1+" "+num2+" "+num1_copy+" "+num2_copy);
                if ((int) num1_copy == 0 ){
                    if (num2_copy % 10 > flag){
                        return -1;
                    }else {
                        return 1;
                    }
                } else if (num2_copy == (double) 0){
                    if (num1_copy % 10 > flag){
                        return 1;
                    } else {
                        return -1;
                    }
                }else if (num1_copy % 10 > num2_copy % 10){
                    return 1;
                } else {
                    return -1;
                }
            }
            
            
        }
    }

    2、用另一种方法排序:

    直接用String存储数字,两个数字(str1,str2)的大小:

    s1 = str1 + str2;

    s2 = str2 + str2;

    s1.compareTo(s2);

    这样比较。

    public class Solution {
        public String largestNumber(int[] nums) {
            String[] strs = new String[nums.length];
            for (int i = 0; i < nums.length; i++){
                strs[i] = String.valueOf(nums[i]);
            }
            Comparator<String> comp = new Comparator<String>(){
                public int compare(String str1, String str2){
                    String s1 = str1 + str2;
                    String s2 = str2 + str1;
                    return s2.compareTo(s1);
                }
            };
            Arrays.sort(strs, comp);
            if (strs[0].charAt(0) == '0'){
                return "0";
            }
            StringBuffer sb = new StringBuffer();
            for (String str : strs){
                sb.append(str);
            }
            return sb.toString();
        }
    }
    
  • 相关阅读:
    日期型数据知识
    如何让VS检查函数和类Comment的添加情况
    HTTP request is unauthorized with client authentication scheme 'Anonymous'.
    将SerializableAttribute序列化为xml
    使用EnterpriseLibrary Validation Block对WCF做验证
    表达式树中递归方法
    使用SignalR在Asp.net中实现进度条
    SQLServer中列出数据库的所有表的创建时间
    用Knockoutjs与Asp.net MVC实现级联下拉列表
    使用UnityAutoMoq简化单元测试
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/6144272.html
Copyright © 2011-2022 走看看