Java 按整数对数字重新排序以获得最小值

Java 按整数对数字重新排序以获得最小值,java,algorithm,Java,Algorithm,如何对整数中的数字重新排序以获得最小值。 前任: 我输入一个数字:$71440,我希望我的输出是:$1447(这是重新排序后的最小值)。我想我会先把数字输入我的输入号码,然后我会重新排序。这是个好算法?是的,如果你 按数字分割 排序数字 用这些数字编一个数字 是的,如果你 按数字分割 排序数字 用这些数字编一个数字 您需要的基本上是对数字的数字进行排序。因此,是的,您提出的方法将起作用,而且似乎是一种合理的做法。您需要的基本上是对数字的数字进行排序。因此,是的,您提出的方法将起作用,而且似乎

如何对整数中的数字重新排序以获得最小值。 前任: 我输入一个数字:$71440,我希望我的输出是:$1447(这是重新排序后的最小值)。我想我会先把数字输入我的输入号码,然后我会重新排序。这是个好算法?

是的,如果你

  • 按数字分割
  • 排序数字
  • 用这些数字编一个数字
    • 是的,如果你

      • 按数字分割
      • 排序数字
      • 用这些数字编一个数字

      您需要的基本上是对数字的数字进行排序。因此,是的,您提出的方法将起作用,而且似乎是一种合理的做法。

      您需要的基本上是对数字的数字进行排序。因此,是的,您提出的方法将起作用,而且似乎是一种合理的做法。

      我认为这大致符合您的要求。假设输入为正数,我相信如果需要,您可以找到如何修改它以处理负数

      public static int leastValue(int input) {
          String s = Integer.toString(input);
          char[] c = s.toCharArray();
          Arrays.sort(c);
          s = new String(c);   
          return Integer.parseInt(s);
      }
      
      基本思想是:

    • 将值转换为字符串
    • 将每个字符放入一个数组中
    • 对字符数组进行排序,在大多数字符集中,这将按从最小到最大的顺序排列数字
    • 再把它变成一根绳子
    • 将其解析为int

    • 我想这大概就是你想要它做的。假设输入为正数,我相信如果需要,您可以找到如何修改它以处理负数

      public static int leastValue(int input) {
          String s = Integer.toString(input);
          char[] c = s.toCharArray();
          Arrays.sort(c);
          s = new String(c);   
          return Integer.parseInt(s);
      }
      
      基本思想是:

    • 将值转换为字符串
    • 将每个字符放入一个数组中
    • 对字符数组进行排序,在大多数字符集中,这将按从最小到最大的顺序排列数字
    • 再把它变成一根绳子
    • 将其解析为int

    • 对于可读性,我认为Diasiares的答案更好。然而,另一种方法是这样的。它使用“类似合并排序”的算法对long进行排序。要了解它是如何工作的,请查看维基百科的

      public static long sort(long num) {
          long res;
          if (num > 9) {
              //split num into two parts(n1, n2)
              int numberOfDigits = (int) Math.log10(num) + 1;
              long n1 = num / (long) Math.pow(10, numberOfDigits / 2);
              long n2 = num % (long) Math.pow(10, numberOfDigits / 2);
      
              //sort each part
              long s1 = sort(n1);
              long s2 = sort(n2);
      
              //merge them into one number
              res = merge(s1, s2);
          } else {
              res = num;
          }
          return res;
      }
      
      /**
       * merges two sorted long into on long e.g 149 and 345 will give 134459
       */
      public static long merge(long num1, long num2) {
          return (num1 == 0 || num2 == 0)
                  ? num1 + num2
                  : num1 % 10 < num2 % 10
                          ? num2 % 10 + merge(num1, num2 / 10) * 10
                          : num1 % 10 + merge(num1 / 10, num2) * 10;
      }
      
      公共静态长排序(long num){
      长余弦;
      如果(数值>9){
      //将num分为两部分(n1、n2)
      int numberOfDigits=(int)Math.log10(num)+1;
      long n1=num/(long)数学功率(10,numberOfDigits/2);
      长n2=数值%(长)数学功率(10,numberOfDigits/2);
      //对每个部分进行排序
      长s1=排序(n1);
      长s2=排序(n2);
      //把它们合并成一个数字
      res=合并(s1,s2);
      }否则{
      res=num;
      }
      返回res;
      }
      /**
      *将两个已排序的long合并为on long,例如149和345将得到134459
      */
      公共静态长合并(长num1,长num2){
      返回值(num1==0 | | num2==0)
      ?num1+num2
      :num1%10
      对于可读性,我认为Diasiares的答案更好。然而,另一种方法是这样的。它使用“类似合并排序”的算法对long进行排序。要了解它是如何工作的,请查看维基百科的

      public static long sort(long num) {
          long res;
          if (num > 9) {
              //split num into two parts(n1, n2)
              int numberOfDigits = (int) Math.log10(num) + 1;
              long n1 = num / (long) Math.pow(10, numberOfDigits / 2);
              long n2 = num % (long) Math.pow(10, numberOfDigits / 2);
      
              //sort each part
              long s1 = sort(n1);
              long s2 = sort(n2);
      
              //merge them into one number
              res = merge(s1, s2);
          } else {
              res = num;
          }
          return res;
      }
      
      /**
       * merges two sorted long into on long e.g 149 and 345 will give 134459
       */
      public static long merge(long num1, long num2) {
          return (num1 == 0 || num2 == 0)
                  ? num1 + num2
                  : num1 % 10 < num2 % 10
                          ? num2 % 10 + merge(num1, num2 / 10) * 10
                          : num1 % 10 + merge(num1 / 10, num2) * 10;
      }
      
      公共静态长排序(long num){
      长余弦;
      如果(数值>9){
      //将num分为两部分(n1、n2)
      int numberOfDigits=(int)Math.log10(num)+1;
      long n1=num/(long)数学功率(10,numberOfDigits/2);
      长n2=数值%(长)数学功率(10,numberOfDigits/2);
      //对每个部分进行排序
      长s1=排序(n1);
      长s2=排序(n2);
      //把它们合并成一个数字
      res=合并(s1,s2);
      }否则{
      res=num;
      }
      返回res;
      }
      /**
      *将两个已排序的long合并为on long,例如149和345将得到134459
      */
      公共静态长合并(长num1,长num2){
      返回值(num1==0 | | num2==0)
      ?num1+num2
      :num1%10
      可能是重复的,因为你们认为这个问题是重复的,所以我得到了2张选票?你们可能得到了反对票,因为你们在提出问题之前没有表现出任何尝试。为了让它更好,你应该包括你为解决这个问题而写的任何代码。明白了,我错了。我只是觉得这几乎是算法问题,不需要显示我的代码。在下一个问题中,我不会这样做。谢谢你们解释可能重复的问题,我得到了2分,因为你们认为这个问题是重复的?你们可能得到了反对票,因为你们在提问之前没有表现出任何尝试。为了让它更好,你应该包括你为解决这个问题而写的任何代码。明白了,我错了。我只是觉得这几乎是算法问题,不需要显示我的代码。在下一个问题中,我不会这样做。感谢您的解释在每次拆分之后,我必须将其附加到int数组中,然后对数组进行排序吗?我可以在Java中这样做吗?@MinhThanh是的,你可以用
      数组对Java中的整数数组进行排序。sort()
      @KyrSt Bucket sort对于大数来说要快得多。每次拆分后,我必须将其附加到整数数组中,然后再对数组进行排序吗?我可以在Java中这样做吗?@MinhThanh是的,您可以在Java中使用
      数组对整数数组进行排序。sort()
      @KyrSt Bucket sort对于大数字来说速度更快。
      char
      的排序顺序是这样的:零将以字符串形式结束在数字的开头。因此,对于
      “71440”
      您将获得
      “01447”
      Integer.parseInt
      将跳过前导的零。
      char
      的排序顺序是,零将以字符串形式结束在数字的开头。因此,对于
      “71440”
      您将获得
      “01447”
      Integer.parseInt
      将跳过前导的零。感谢您的评论谢谢您的评论