我的作业需要做的是将正数的数字从低到高排序。
我可以用
我无法使用
答案 0 :(得分:16)
这样就可以了!
int number = 52146729;
int sortedNumber = 0;
for (int i = 9; i >= 0; i--)
{
int tmpNumber = number;
while (tmpNumber > 0)
{
int digit = tmpNumber % 10;
if (digit == i)
{
sortedNumber *= 10;
sortedNumber += digit;
}
tmpNumber /= 10;
}
}
System.out.println(sortedNumber);
这是java btw。鉴于这种限制,这是非常有效的,O(n)。
答案 1 :(得分:0)
鉴于完全缺乏需求,不确定这会有所帮助,但如果我在生产代码中执行此操作,我会使用列表和LINQ OrderBy方法:
List<int> testList = new List<int> { 1, 5, 10, 4, 2 };
IEnumerable<int> orderedList = testList.OrderByDescending(x => x);
对于数字排序,您已经非常清楚“数组”是什么。你需要某种集合才能实现这一目标。我会再次使用一个列表:
List<int> digits = new List<int>();
int remainingNumber = 52146729;
while (remainingNumber > 0)
{
digits.Add(remainingNumber % 10);
remainingNumber /= 10;
}
IEnumerable<int> orderedDigits = testList.OrderByDescending(x => x);
这是有效的,因为x mod y返回x / y的余数。所以9%10回报9,19%10回报等等。然后你除以10除去一位数,然后重复直到你用完为止。然后我使用与以前相同的顺序功能。这种方法绝对不使用字符串,也不使用任何显式数组(List是引擎盖下的数组)。就像我说的那样,没有任何类型的集合来实现这一点将会非常难看。
打印出该列表很简单(如果您只需要打印输出):
foreach (int i in orderedDigits)
Console.Write(i);
如果你需要一个实际的数字,这会有点困难,所以我现在就把它关掉。
答案 2 :(得分:0)
为什么不尝试使用树?
用两个孩子建造一棵树:左右。左边的孩子存储较少的数字,而右边的孩子则存储较高因此,您需要考虑具有两种可能选择的节点。第一个数字是树的根。下一个号码可以左右存储。
树已满后,您可以使用有序方法访问每个号码: 1-左读; 2-读父母; 3-阅读rigth。
答案 3 :(得分:0)
做基数风格:
int count9
int count8
int count7
int count6
int count5
int count4
int count3
int count2
int count1
int count0
// loop over the number and fill in the counts. (either with characters or by using %10)
for (int i = 0; i < count9; i++)
print "9"
// more for loops, etc, downto 8.
绝对不是生产代码,但这几乎是由赋值的约束排除的。
希望这有帮助!