当前位置: 首页 > 知识库问答 >
问题:

给定一个整数N。java中大于N的最小整数是什么

狄睿
2023-03-14

我试着写一个代码,它接受一个介于1和1_000_000之间的整数,并返回一个比相同数字的整数大的最小整数,如果它不存在,则打印0。

举个例子

输入:156

输出165

输入330

输出0

输入27711

输出71127

我的问题是,下面的代码没有为其他输入返回正确的输出。

例如,在输入4231中,输出应该是4312。

我很难找到为每个输入返回正确输出的最佳算法。

TNX提前

import java.util.Scanner;

public class Test4 {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String x = sc.nextLine();
    char[] chars = new char[x.length()];
    char[] oldChars = new char[x.length()];


    char temp;
    for (int i = 0; i < x.length(); i++) {
        chars[i] = x.charAt(i);
        oldChars[i] = chars[i];
    }


    if (x.length() > 3){
        for (int j = 0; j < x.length(); j++) {      
            if (chars[0] < chars[j]) {
                temp = chars[0];
                chars[0] = chars[j];
                chars[j] = temp;
                break;
            }
        }

        for (int j = 1; j <= x.length() ; j++) {           
            for (int i = 1; i < x.length() - 1; i++) {
                if (chars[i] > chars[i+1]){
                    temp = chars[i];
                    chars[i] = chars[i+1];
                    chars[i+1] = temp;
                }
            }
        }
        for (int i = 0; i < x.length(); i++) {
            System.out.print(chars[i]);
        }
    }
    
    else if (x.length() == 1)
        System.out.println(0);

    else {
            temp = chars[x.length()-2];
            chars[x.length()-2] = chars[x.length()-1];
            chars[x.length()-1] = temp;
            if (chars[x.length()-2] > oldChars[x.length()-2])
                for (int i = 0; i < x.length(); i++) {
                    System.out.print(chars[i]);
                }
            else
                System.out.println(0);
    }
    

    sc.close();
}

}

共有3个答案

西门嘉石
2023-03-14

如果您可以使用apache commons collections4,并且性能无关紧要,那么您可以使用以下内容:

package test;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

public class NextNumberCalculator {
    public int calculateNearest(int input) {
        List<Character> inputChars = String.valueOf(input).chars()
                .mapToObj(c -> (char) c)
                .collect(Collectors.toList());
        
        return CollectionUtils.permutations(inputChars)
                .stream()
                .mapToInt(chars -> Integer.parseInt(StringUtils.join(chars, "")))
                .filter(permutation -> permutation > input)
                .min()
                .orElse(0);
    }
}

下面是一些单元测试:

package test;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class NextNumberCalculatorTest {
    private NextNumberCalculator calculator;
    
    @BeforeEach
    void setUp() {
        calculator = new NextNumberCalculator();
    }
    
    @Test
    void calculateNearest() {
        Assertions.assertEquals(165, calculator.calculateNearest(156));
        Assertions.assertEquals(0, calculator.calculateNearest(330));
        Assertions.assertEquals(71127, calculator.calculateNearest(27711));
        Assertions.assertEquals(414, calculator.calculateNearest(144));
    }
}
令狐珂
2023-03-14

这里有一种方法。

  • 从最少的N有效数字开始<代码>N以2开头。保存一份副本
  • 然后创建那些N数字的所有排列
  • 将它们连接成一个字符串并放入TreeMap
public class NextLargestInteger {
    public static void main(String[] args) {
 

生成10个随机数。

        Random r = new Random();
        for (int i = 0; i < 10; i++) {
          int val = r.nextInt(Integer.MAX_VALUE);
          System.out.printf("%-12s   %-12s%n",val,nextHighest(Integer.toString(val)));
        }

打印出类似于

1446553155     1446553[515]
1801279982     18012[82799]
1894877459     18948774[95]
805018669      8050186[96] 
521703779      5217037[97] 
1926164416     19261644[61]
1236907656     12369076[65]
1326860288     1326860[828]
1049149602     10491496[20]
1516995584     1516995[845]

右边的括号显示了为获得最小值而排列的endpoint

主要方法。

    public static String nextHighest(String e) {
        char[] digits = e.toCharArray();
        // start two digits from the end
        int i = digits.length - 2;
        // tree set to store the permuted strings
        NavigableSet<String> set = new TreeSet<>();
        for (; i >= 0; i--) {
            
            // the last N digits
            char[] shortList =
                    Arrays.copyOfRange(digits, i, digits.length);

            // save a copy of the original N digit ending
            String originalTail = new String(shortList);

            permute(shortList, digits.length - i, set);
            
            // get the next higher ending from the set
            String minTail = set.higher(originalTail);
            // if it exists, return the value.
            if (minTail != null) {
                String head =
                        new String(Arrays.copyOfRange(digits, 0, i));
                return String.format("%s[%s]", head, minTail);
            }
            // clear the set and try a larger ending.
            set.clear();
        }
        // no success, return the original value.
        return e;
    }

置换字符数组的实用方法

    public static void permute(char[] elements, int length,
            Set<String> vals) {
        if (length == 1) {
            vals.add(new String(elements));
        } else {
            for (int i = 0; i < length; i++) {
                permute(elements, length - 1, vals);
                if (length % 2 == 1) {
                    swap(elements, 1, length - 1);
                } else {
                    swap(elements, i, length - 1);
                }
            }
        }
        
    }

交换数组元素的实用程序方法。

    public static void swap(char[] list, int i, int j) {
        char temp = list[i];
        list[i] = list[j];
        list[j] = temp;
    }
} 

应涵容
2023-03-14

请试试这个

int muldigits(int n){

    int result = 0;

    String [] strings = String.valueOf(Math.abs(n)).split("(?!^)");
    List<Integer> intsList = new ArrayList<>();
    for (String string : strings) {
        intsList.add(Integer.parseInt(string));
    }

    if(n<0){
        Collections.sort(intsList);
        String temp = Arrays.toString(intsList.toArray()).replace(", ", "");
        System.out.println(temp);
        result = - Integer.parseInt(temp.substring(1, temp.length()-1));
    }else{
        Collections.sort(intsList, Collections.reverseOrder());
        String temp = Arrays.toString(intsList.toArray()).replace(", ", "");
        result = Integer.parseInt(temp.substring(1, temp.length()-1));
    }
    return result;
}
 类似资料:
  • 本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1

  • 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集的和是否和是否最小,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

  • 给定一个数组形式的未排序(多)整数集,求其和大于或等于常量整数x的最小基数子集。 我们的集合是{4 5 8 10 10},x=15,所以最小基数子集和 这个问题与以下问题相关但不同:给定一个n个整数的列表,找到大于X的最小子集和在前面的问题中,作者要求得到一个和最接近X的子集,这里我们想要任何子集

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 你能展示一下你是否得到了一个由n个整数组成的数组吗。数组中的整数介于1和n-1之间。必须找到重复的整数。你需要在O(n)时间内完成,但你可以使用额外的空间。 输入格式:输入包含数组中的元素数,后跟数组中的元素。 输出格式:输出返回重复的整数,如果没有重复,则返回-1。 示例测试用例: 输入:5 1 4 3 2 3 输出:3 输入4

  • 我想找出一种方法,从整数中找出整数的最大和。 在这种情况下,输入总是整数的数组,任务是使用数字(每个数字只能使用一次)计算最大可能的和。 以下是我到目前为止提出的方法,但我不知道如何用一种方法来完成这一切。 有了这个输入:程序应该打印出。

  • 本文向大家介绍查找三个小于或等于N的整数,以使它们的LCM最大-C ++,包括了查找三个小于或等于N的整数,以使它们的LCM最大-C ++的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个基于LCM概念的程序。如标题所示,我们必须找到三个小于或等于LCM最大的给定数字的数字。 让我们来看一个例子。 在深入探讨问题之前,让我们看看什么是LCM并为其编写程序。 LCM是数字的最小公倍