我刚刚完成了入学考试,其中一项任务是找到所有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;代码和我真正感兴趣的是如何有效地找到这些数字。
答案 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();