问题:打印所有只有唯一数字的号码。 输入:n = 15 输出:1 2 3 4 5 6 7 8 9 10 12 13 14 15
这里不包括11,因为它有1次,相同的方式123,456 ..也有效,但121 1344无效,因为有多个相同的数字。
我正在从1-n运行循环并检查每个号码。 我正在使用Hash-map来确定数字的唯一性。
上述问题是否有更好的解决方案。
答案 0 :(得分:3)
我不确定,但是那样......
List<int> numbers = new List<int>(){};
numbers =numbers.Where(p=>validCheck(p)==true).ToList();
static bool validCheck(int n)
{
return (n.ToString().Length==n.ToString().Disctinct().Count());
}
答案 1 :(得分:2)
您可以使用LINQ,将数字转换为字符串,并检查字符串的长度是否等于不同的charchters的数量。
for (int i = 1; i < n; i++){
if (i.ToString().Length == i.ToString().Distinct().Count())
Console.Out.Write(i + " ");
}
答案 2 :(得分:1)
作为一个半有用的库函数,你可以用一个开头和你想要的数量来播种它。
UniqueDigits(0,15).ToList().ForEach(Console.WriteLine);
然后
foreach (var digit in UniqueDigits(100,50))
{
Console.WriteLine(digit);
}
或
<a href="#divIdName">Go here</a>
<div id="divIdName">Destination</div>
答案 3 :(得分:0)
这就是我如何消除具有重复字符的数字。
declare @Startdate datetime; @Startdate = convert(datetime, 'mydate')
答案 4 :(得分:0)
我的想法:
没有发生字符串操作,所以它应该带来效率
答案 5 :(得分:0)
字符串是IEnumerable - 因此您可以使用LINQ语句来解决您的问题:
Numbers.Where(N => N.ToString().Distinct().Count() == N.ToString().Length);
查询检查您的号码字符串中有多少个字符不同,并将此号码与总字符数相匹配。
这是整个代码打印出所有不同的数字,直到20:
List<int> Numbers = new List<int>();
for (int i = 1; i <= 20; i++)
{
Numbers.Add(i);
}
IEnumerable<int> AcceptedNumbers = Numbers.Where(N => N.ToString().Distinct().Count() == N.ToString().Length);
foreach (int AcceptedNumber in AcceptedNumbers)
{
Console.WriteLine(AcceptedNumber);
}
答案 6 :(得分:0)
另一个解决方案是使用整数除法和模数(没有数字到字符串转换)。您可以使用以下方法验证数字的唯一性(假设digits
是具有10个元素的int
数组)。
public static bool IsUnique(int num) {
int[] digits = new int[10];
num = Math.Abs(num);
while (num > 0) {
int r = num % 10;
num /= 10;
digits[r] ++;
if (digits[r] > 1) {
return false;
}
}
return true;
}
答案 7 :(得分:0)
只有9 * 9! /(10 - n)!带有n
位数的唯一数字数字。对于较大的n
,您可能需要下一个词典算法来避免不必要的迭代。 (例如,只有544,320个7位唯一数字,但你的程序需要迭代近1000万个数字来生成它们!)
以下是我对下一个词典过程的尝试,其中包含一组n-unique-digit
个数字(n > 1
}):
(1) From left to right, start with the digits 10, then ascend from 2.
For example, the first 4-digit number would be 1023.
(2) Increment the right-most digit that can be incremented to the next available
higher digit unused by digits to its left. Ascend to the right of the
incremented digit with the rest of the available digits, starting with lowest.
Examples: 1023 -> 1024 (4 is unused by the digits left of 3)
^
9786 -> 9801 (8 is unused be the digits left of 7)
^
9658 -> 9670 (7 is unused by the digits left of 5)
^