【问题标题】:Create an algorithm that arranges them in order to form the largest possible integer创建一个算法来排列它们以形成最大可能的整数
【发布时间】:2020-11-12 01:23:05
【问题描述】:

我正在努力解决 Java 中的这个编码问题。它必须使用算法来解决。它应该给我可以用数组中的数字形成的最大可能的 inter:{10, 7, 76, 415}。我尝试使用选择排序来解决它。到目前为止,我的代码如下,但它给了我错误的输出。我的代码:

公共类最大数{ 公共静态 int maximumNumber(int[] arr) {

    for (int i = 1; i < arr.length -1; i++) {
        for (int j = i +1; j < arr.length; j++) {
            String temp1 = Integer.toString(i) + Integer.toString(j);
            String temp2 = Integer.toString(j) + Integer.toString(i);
            
            if (Integer.parseInt(temp2) > Integer.parseInt(temp1)) {
                int swap = arr[i];
                arr[i] = arr[j];
                arr[j] = swap;
            }
        }

    
    }
    
    String ansNum = "";
    for (int i = 0; i < arr.length; i++) {
        ansNum += Integer.toString(arr[i]);
        
    }
    
    return Integer.parseInt(ansNum);

}
public static void main(String[] args) {   
    int [] arr = {10, 7, 76, 415};
    int output = largestNumber(arr);
    System.out.println(output); //Print out the number
}

}

此代码的给定输出为:10415767 但正确答案是:77641510

请提供您的反馈和想法。

【问题讨论】:

  • 那么,对于输入数组 {10, 7, 76, 415},答案应该是 77,641,510 吗?因为你可以很快变得比 int 更大。
  • 您没有提到您的代码应该解决什么问题,或者您的代码当前所做的与此不同。
  • 但作为对问题所在的“第一次猜测”。你是 return-ing 一个 String 来自一个说它将返回一个 int 的方法。
  • 您还需要修复交换代码。你需要一个临时变量。
  • 我认为算法方法更简单:您可以按前导字符降序排列它们,然后是第二个字符等。不匹配的长度会比较最后一个字符(所以@ 987654325@ 7 79)。最终结果将是最大可能的数字(按数字计算)。

标签: java algorithm sorting selection-sort


【解决方案1】:

修复错误如下所示,它应该可以工作。

for (int i = 0; i < arr.length; i++) { //correction here
        for (int j = i +1; j < arr.length; j++) {
                String temp1 = Integer.toString(arr[i]) + Integer.toString(arr[j]); //correction here
                String temp2 = Integer.toString(arr[j]) + Integer.toString(arr[i]); //correction here

要编写一些优雅的代码,我会使用如下所示的比较器:

        String[] stringArr = new String[arr.length];
        for(int i = 0; i < arr.length; i++)
            stringArr[i] = String.valueOf(arr[i]);
    
        Comparator<String> comp = new Comparator<String>(){
            @Override
            public int compare(String str1, String str2){
                String s1 = str1 + str2;
                String s2 = str2 + str1;
                return s2.compareTo(s1);
            }
         };
        
        Arrays.sort(stringArr, comp);
    
        String ansNum = "";
        for(int i = 0; i < stringArr.length; i++) {
            ansNum += stringArr[i];
            
        }
        
        return Integer.parseInt(ansNum);

谈到时间复杂度,代码中的两个for循环使这个解决方案O(n^2),而使用排序它变成O(nlog(n)),其中n是元素的数量输入数组。因此,使用比较器不仅代码变得优雅,在这种情况下它也变得高效。

【讨论】:

    【解决方案2】:
    public class largestNumber { 
      public static int largestNumber(int[] arr) {
    
        for (int i = 0; i < arr.length -1; i++) {
            for (int j = i +1; j < arr.length; j++) {
                String temp1 = Integer.toString(arr[i]) + Integer.toString(arr[j]);
                String temp2 = Integer.toString(arr[j]) + Integer.toString(arr[i]);//rectified
                
                if (Integer.parseInt(temp2) > Integer.parseInt(temp1)) {
                    int swap = arr[i];
                    arr[i] = arr[j];
                    arr[j] = swap;
                }
            }
    
        
        }
        
        String ansNum = "";
        for (int i = 0; i < arr.length; i++) {
            ansNum += Integer.toString(arr[i]);
            
        }
        
        return Integer.parseInt(ansNum);
    
    }
        public static void main(String[] args) {   
            int [] arr = {10, 7, 76, 415};
            int output = largestNumber(arr);
            System.out.println(output); //Print out the number
        }
    }
    

    【讨论】:

    • 纯代码的答案通常没什么用,因为它没有解释为什么这个特定的代码有效。尝试添加解释。
    猜你喜欢
    • 2021-10-18
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多