Java 如何获取由整数的某些数字组成的最大数

Java 如何获取由整数的某些数字组成的最大数,java,algorithm,Java,Algorithm,我有一个号码。这个数字有很多位数。我想写一个函数,返回由该数字的一些数字组成的最大数字。当得到最大的数字时,数字的顺序不应该改变 int myFunction(int n, int cat){ ... return max; } 如果n=38462637和cat=3函数必须返回86637,即如果cat=3函数预期返回5位数字,如8-3=5。原始数字有许多5位数字的变体,但最大可能的数字是86637。在这种情况下,最重要的要求是数字不应改变其位置。如果您有权访问代码,请将数字存

我有一个号码。这个数字有很多位数。我想写一个函数,返回由该数字的一些数字组成的最大数字。当得到最大的数字时,数字的顺序不应该改变

int myFunction(int n, int cat){
   ...
   return max;   
}

如果
n=38462637
cat=3
函数必须返回
86637
,即如果
cat=3
函数预期返回5位数字,如
8-3=5
。原始数字有许多5位数字的变体,但最大可能的数字是
86637
。在这种情况下,最重要的要求是数字不应改变其位置。

如果您有权访问代码,请将数字存储为带有分隔符(空格、逗号等)的字符串,然后使用字符串分隔符函数将每个数字(字符串字符)放入其自己的数组位置。解析字符串数组并生成整数数组。然后在数组上运行快速排序。完成后,取整数的前X个数,这是您的数字。

贪婪-选择答案中最左边的最大数字(如果该数字出现在多个位置,请选择其最左边的位置)。如果一个数字不是0,那么它可能是最左边的,我们在它的右边至少有n-cat-1个数字

之后,使用相同的算法在该数字位置右侧创建最大的数字,该数字正好有
n-cat-1
个数字。继续迭代,直到生成数字。只需注意,您在第一次迭代后选择的数字可能为零(因为它们不再是结果数字中最左边的数字)


编辑:使用上述算法的最佳解决方案-用于计算每个连续数字位置可能的最高值。理论上,这可以通过每次查询的固定时间和使用线性预计算的线性额外内存来实现,但该算法非常复杂且难以实现,因此它只会为真正大的n值提供改进。我个人建议使用一种会导致O(n*log(n))时间复杂度的方法。

这可能有点过于复杂,但似乎有效:

public static int myFunction(int n, int cat) {
    String numString = String.valueOf(n);
    int finalLength = numString.length() - cat;
    int[] positions = new int[finalLength];
    StringBuilder answer = new StringBuilder();
    for (int i = 0; i < finalLength; i++) {
        for (int j = (i == 0 ? i : positions[i - 1] + 1); j <= numString.length() - finalLength + i; j++) {
            if (positions[i] == 0 || numString.charAt(j) > numString.charAt(positions[i]) ) {
                positions[i] = j;
            }
        }
        answer.append(numString.charAt(positions[i]));
    }
    return Integer.parseInt(answer.toString());
}

但是数字不应该改变它们在存储变量中的位置。如果将数字保存在A中,则使用字符串数组B[]和快速排序的整数数组C[],然后从C[]输出,A仍然是输入的数字。izomorphius thanx供您帮助!
public static int myFunction(int n, int cat) {
    List<Integer> digits = new ArrayList<Integer>();
    int number = n;
    while (number > 0) {
        digits.add(number % 10);
        number /= 10;
    }
    int finalLength = digits.size() - cat;
    int lastIndex = digits.size();
    int answer = 0;
    for (int i = 0; i < finalLength; i++) {
        int highestDigit = -1;
        for (int j = lastIndex - 1; j >= finalLength - i - 1; j--) {
            if (digits.get(j) > highestDigit) {
                highestDigit = digits.get(j);
                lastIndex = j;
            }
        }
        answer = answer * 10 + highestDigit;
    }
    return answer;
}