【问题标题】:Maximum number that can be formed from the given digits可以由给定数字组成的最大数字
【发布时间】:2020-02-04 20:27:39
【问题描述】:

给定一个整数,找出可以由数字组成的最大数。 输入:8754365 输出:8765543

我在 $O(n logn)$ 中告诉了解决方案。他让我进一步优化。

我们可以使用Hash Table进一步优化,$\rightarrow$ O(n)

算法: 1. 取一个大小为 10(0 到 9)的哈希表。 2. 存储从 0 到 9 的每个数字的计数。 3. 逆向(从 9 到 0)打印 Hash 表相对于数字计数的索引。

例子:

8754365 $\rightarrow$ (0 0 0 1 1 2 1 1 1 0) 的数字计数后的哈希表 以相反的顺序打印哈希表相对于它们的计数的索引 $\rightarrow$ 8765543 时间复杂度:O(n) 如果我错了,请纠正我。

【问题讨论】:

  • 是的,这确实有效,因为哈希表中有恒定数量的键。不过你也可以使用数组。
  • @MillieSmith 但它是最优的吗
  • 我不明白你怎么能比 O(n) 更快地做到这一点。您需要查看号码中的所有数字。这需要 n 步。

标签: algorithm hash


【解决方案1】:

以下贪婪的code 在 O(n) 时间内完成此操作。其中n是数字中的位数。

int num = 8756404;
int[] times = new int[10];
while(true){
    if(num==0){
        break;
    }
    int val = num%10;
    times[val]++;
    num /= 10;
}
for(int i=9; i>=0; i--){
    for(int j=0; j<times[i]; j++){
        System.out.print(i);
    }
}

它通过计算输入数字中每个数字的出现次数来工作。然后以相反的顺序打印每个数字在输入数字中的次数,即。从 9 到 0。

【讨论】:

  • num = (num - num%10)/10; 为什么不只是num /= 10?在这种情况下,Java 会进行整数除法,我很确定。
  • 另外,while (num != 0)
  • 我称之为编码偏好。 :P
【解决方案2】:

运行时间:00:00:00.01

public int Assignment(int number) 
{
    // Consider that int.MaxValue equals to 2147483647
    var siblingString = String.Join("", number.ToString().ToCharArray().OrderByDescending(n => n));
    int sibling = -1;
    if (!int.TryParse(siblingString, out sibling) || sibling > 100000000)
    {
        return -1;
    }
    return sibling;
}

使用以下代码测试的性能:

static void Main()
{
    Stopwatch stopWatch = new Stopwatch();

    stopWatch.Start();
    var result = AssignmentOne(2147483646);
    stopWatch.Stop();

    TimeSpan ts = stopWatch.Elapsed;
    string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
    Console.WriteLine("RunTime " + elapsedTime);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2019-12-17
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多