给定一个整数,找到可以由数字形成的最大数字。输入: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 2 1 1 1 0)打印哈希表相对于其计数的索引以相反的顺序$ \ rightarrow $ 8765543时间复杂度:O(n)如果我错了,请纠正我。
以下贪婪代码在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。