C# 生成所有递增的数字
我在面试中遇到了以下问题 对于给定的位数,生成所有数字,使高阶数字的值小于低阶数字的值 145//1<4<5 有没有比我提出的方法更好(更有效)的方法:C# 生成所有递增的数字,c#,java,C#,Java,我在面试中遇到了以下问题 对于给定的位数,生成所有数字,使高阶数字的值小于低阶数字的值 145//1
public static void GenerateSpecialNumbers(int noDigits)
{
int prod = 1;
for(int i=0; i < noDigits; i++)
{
prod = prod * 10;
}
int minValue = prod/10;
int maxValue = prod - 1;
for(int i = minValue; i < maxValue; i++)
{
bool isValid = true;
int num = i;
int max = int.MaxValue;
while(num > 0)
{
int digit = num % 10;
if(digit >= max)
{
isValid = false;
break;
}
max = digit;
num = num/10;
}
if(isValid)
Console.WriteLine(i);
}
}
公共静态无效生成特殊编号(int noDigits)
{
int prod=1;
对于(int i=0;i0)
{
整数位数=num%10;
如果(数字>=最大值)
{
isValid=false;
打破
}
最大值=位数;
num=num/10;
}
如果(有效)
控制台写入线(i);
}
}
编辑:
3位数字的输出:
123
124
125
126
127
128
129
134
135
136
137
138
139
145
146
147
148
149
156
157
158
159
167
168
169
178
179
189
234
235
236
237
238
239
245
246
247
248
249
256
257
258
259
267
268
269
278
279
289
345
346
347
348
349
356
357
358
359
367
368
369
378
379
389
456
457
458
459
467
468
469
478
479
489
567
568
569
578
579
589
678
679
689
789是的,这个问题有一个简单的递归描述,可以构造所有数字,而不必测试和丢弃任何数字 例如,有效的
n
数字包括“1”。追加(所有有效的n-1
数字仅使用数字>1
)
每个数字的下限为1加上紧靠其左侧的数字。你能找到一个简单的上限吗
for (i1 from 1 to 9)
for (i2 from 1 to i1 - 1)
for (i3 from 1 to i2 - 1)
print(i1 * 1 + i2 * 10 + i3 * 100);
固定长度的数字不需要递归。易于编码和故障保护
请注意,循环上限不是固定的。这就是为什么要这样做。因为我喜欢基于表的东西,所以我会先为n=2生成表(<100个条目,很明显),然后将它保存在一个初始化的数组中 那么f(n)=由f(n-1)组成的序列n[1,2,3,4,5,6,7,8,9]中的数字,其中f(n-1)[0]>n
漂亮的拼图!以下是我的看法:
static void Main()
{
WriteNumbers(3);
}
static void WriteNumbers(int digits, int number = 0)
{
int i = (number % 10) + 1;
number *= 10;
for (; i <= 9; i++)
{
if (digits == 1)
Console.WriteLine(number + i);
else
WriteNumbers(digits - 1, number + i);
}
}
static void Main()
{
写入者(3);
}
静态void WriteNumbers(整数位数,整数编号=0)
{
int i=(数字%10)+1;
数字*=10;
对于(;i这里有一个提示:如果有N个可能的数字值,并且您想要选择其中的M个,那么可能性的数量是“N选择M”。这里有一个解决方案(尽管有点黑客风格),它适用于任意数量的数字:
private static void printSpecialNumbers(int noOfDigits){
int max = (int) Math.pow(10, noOfDigits);
int min = (int) Math.pow(10, noOfDigits-1);
for(int i = min; i < max; i++){
if(isSpecialNumber(i))
System.out.println(i);
}
}
private static boolean isSpecialNumber(int i){
String intString = String.valueOf(i);
String[] digits = intString.split("");
for(int k = 1; k < digits.length-1; k++){
if(Integer.valueOf(digits[k]) >= Integer.valueOf(digits[k+1]))
return false;
}
return true;
}
private静态无效打印特殊编号(int noOfDigits){
int max=(int)Math.pow(10,noOfDigits);
int min=(int)Math.pow(10,noOfDigits-1);
对于(int i=min;i=整数.valueOf(位数[k+1]))
返回false;
}
返回true;
}
这是我的解决方案,它来自和@Ben Voigt的评论。我觉得这更容易理解:
static void WriteNumbers(int digits, int left=0,int number=0)
{
for(int i=left+1; i<10; i++)
{
if(digits==1)
{
Console.WriteLine(number*10+i);
}
else
{
WriteNumbers(digits - 1, i, number*10 + i);
}
}
}
static void WriteNumbers(整数位数,整数左=0,整数编号=0)
{
对于(int i=left+1;idigits总是从左到右递增)我想我没有很好地表达这个问题。请检查所需的输出。请您再解释一下。@mkg,我发布了我的答案(我希望如此)。0和递减而不是递增有什么关系?“0”是一个错误。我将它改为1。i1是最后一个数字,而不是第一个。最后一个是最小的。循环条件可以减少为I
static void WriteNumbers(int digits, int left=0,int number=0)
{
for(int i=left+1; i<10; i++)
{
if(digits==1)
{
Console.WriteLine(number*10+i);
}
else
{
WriteNumbers(digits - 1, i, number*10 + i);
}
}
}