可以从给定数字形成的最大数量

时间:2015-03-20 10:14:15

标签: algorithm hash

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

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

我们可以使用哈希表进一步优化,$ \ rightarrow $ O(n)

算法: 1.获取大小为10(0到9)的哈希表。 2.存储从0到9的每个数字的计数。 3.以反方向打印哈希表的索引(从9到0)。

示例:

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

2 个答案:

答案 0 :(得分:2)

以下贪心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。

答案 1 :(得分:0)

运行时间: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);
}