Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 生成所有递增的数字_C#_Java - Fatal编程技术网

C# 生成所有递增的数字

C# 生成所有递增的数字,c#,java,C#,Java,我在面试中遇到了以下问题 对于给定的位数,生成所有数字,使高阶数字的值小于低阶数字的值 145//1

我在面试中遇到了以下问题

对于给定的位数,生成所有数字,使高阶数字的值小于低阶数字的值

145//1<4<5

有没有比我提出的方法更好(更有效)的方法:

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);
               }
           }
        }