给定一个整数,找到可以从数字形成的最大数字。 输入: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) 如果我错了,请纠正我。
答案 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);
}