找到所有不同位数的4位数字

时间:2016-05-25 17:54:43

标签: c#

我刚刚完成了入学考试,其中一项任务是找到所有4位数的不同数字",时间已经不多了,并且做了这个:

List<int> l = new List<int>();
int number = 0;
for(int i = 1; i < 10; i++)
{
    number += i;
    for (int j = 0; j < 10; j++)
    {
        if (j == i) continue;
        number = (number * 10) + j;
        for (int y = 0; y < 10; y++)
        {
            if (y == i || y == j) continue;
            number = (number * 10) + y;
            for (int x = 0; x < 10; x++)
            {
                if (x == y || x == i || x == j) continue;
                number = (number * 10) + x;
                l.Add(number);
                number = (number - x) / 10;
            }
            number /= 10;
        }
        number /= 10;
    }
    number = 0;
}

我认为这是一个非常&#34;愚蠢的&#34;代码和我真正感兴趣的是如何有效地找到这些数字。

4 个答案:

答案 0 :(得分:1)

List<int> numbers = Enumerable.Range(0, 9999).Where(
        x => x.ToString().ToCharArray().Distinct().Count() == x.ToString().Length)
    .ToList();

所以基本上,取数字0000-9999,然后将每个转换为字符串。如果字符串中不同字符的数量与字符串的长度相同,则它有效。

(我们不会只检查4,因为例如21变为&#34; 21&#34;,它没有4个不同的字符。)

答案 1 :(得分:0)

你还记得代码是什么吗?它是在int []数组中吗?如果是这样,选择Distinct()的LINQ语句就可以了。

如果是以下内容:

var numberList = new List<int[]>();

列表中的每个项目都包含(4)单独的整数,其中一些重复。你可以很容易地做到:

var distinctList = numberList.Where(x=>x.Length <= 4).Distinct();

或者即使您想要计数:

       foreach (var iL in Numbers.Where(x=>x.Length <= 4))
        {
            var anyCnt = Numbers.Count(x => x == iL);
            if (anyCnt > 1)
            {
                //Do something 
            }
         }

但两个答案都意味着测试允许LINQ。

答案 2 :(得分:0)

static void Main(string[] args)
{
    string[] ints = new string[] { "7778", "9875", "8347", "8", "83248" };
    string currentInt;
    int counter = 0;
    for (int intCnt = 0; intCnt < ints.Length; intCnt++)
    {
        currentInt = ints[intCnt];
        if (currentInt.Length == 4)
        {
            char[] charDistinct = currentInt.Distinct().ToArray();
            counter = charDistinct.Length == 4 ? counter + 1 : counter;
        }
    }
}

答案 3 :(得分:0)

这是我的解决方案,它很简单,应该具有低复杂性。 try it here

    List<int> l = new List<int>();
    for (int a = 1; a < 10; a++)
    {
        for (int b = 0; b < 10; b++)
        {
            if (a == b)
                continue;

            for (int c = 0; c < 10; c++)
            {
                if (a == c || b == c)
                    continue;

                for (int d = 0; d < 10; d++)
                {
                    if (a == d || b == d || c == d)
                        continue;

                    l.Add(a*1000 + b*100 + c*10 + d);
                }
            }
        }
    }

或者在Linq中也是如此:

List<int> numbers = (from a in Enumerable.Range(1,9)
                     from b in Enumerable.Range(0,10)
                     where a != b
                     from c in Enumerable.Range(0,10)
                     where a != c && b != c
                     from d in Enumerable.Range(0,10)
                     where a != d && b != d && c != d
                     select a * 1000 + b * 100 + c * 10 + d).ToList();