打印所有唯一的数字
本文关键字:数字 唯一 打印 | 更新日期: 2023-09-27 18:08:08
问题:打印所有只有唯一数字的数字。输入:n =15输出:12 3 4 5 6 7 8 9 10 12 13 14 15
这里11不包括在内,因为它有两次1,同样的123,456 ..也是有效的,但是121 1344无效,因为同一个数字多次出现。
我正在从1到n运行循环并检查每个数字。我正在使用哈希映射来确定数字的唯一性。
对于以上问题有没有更好的解决办法
我不确定,但大概是这样的…
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());
}
您可以使用LINQ,将数字转换为字符串,并检查字符串的长度是否等于不同字符的数量。
for (int i = 1; i < n; i++){
if (i.ToString().Length == i.ToString().Distinct().Count())
Console.Out.Write(i + " ");
}
作为一个半有用的库函数,你可以用一个起始值和你想要多少。
public static IEnumerable<int> UniqueDigits(int start, int count)
{
for (var i = start; i < (start + count); i++)
{
var s = i.ToString();
if (s.Distinct().Count() == s.Length)
{
yield return i;
}
}
}
然后UniqueDigits(0,15).ToList().ForEach(Console.WriteLine);
或
foreach (var digit in UniqueDigits(100,50))
{
Console.WriteLine(digit);
}
这就是我如何消除有重复字符的数字。
Console.Write("Input:");
int number = int.Parse(Console.ReadLine());
List<int> numbers = new List<int>();
List<int> acceptedNumbers = new List<int>();
for (int i = 1; i <= number; i++)
{
numbers.Add(i);
}
foreach (var num in numbers)
{
bool rejected = false;
char[] numChars = num.ToString().ToCharArray();
foreach (var numChar in numChars)
{
if (numChars.Where(n => n == numChar).Count() > 1)
{
rejected = true;
}
}
if (!rejected)
{
acceptedNumbers.Add(num);
}
}
acceptedNumbers.ForEach(n => Console.Write($"{n} "));
Console.Read();
字符串是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);
}
我的想法
- 运行从0到n的循环
- 对于每批10个数字(如从0到9,10到19,230到239…),从最后一个数字中挑出数字。这些数字映射到倾向于被跳过的计数器。其余的都要排出。例如:对于批次12x,选择1 &2,现在我们知道我们必须跳过位置1和2的数字,其余的都是可以接受的,所以不需要对它们进行任何处理。
- 将上述数字以排序方式保存在arrayList中,并保持索引为0的指针。我们叫它"ptr"。在运行该批处理时,检查每个批处理的count(从0移动到9)是否等于数组[ptr]。如果没有,则输出号码。否则,跳过它,执行ptr++。
- 当你做步骤2时,检查是否有重复的数字。如果是,请跳过整批10。
没有字符串操作发生,所以它应该带来效率
另一个解决方案是使用整数除法和取模(没有数字到字符串的转换)。您可以使用以下方法验证数字的唯一性(假设digits
是int
数组,有10个元素)。
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;
}
工作示例http://ideone.com/9emEoz
只有9 * 9!/(10 - n)!包含n
数字的唯一数字。对于较大的n
,您可能需要一个next字典编纂算法来避免不必要的迭代。(例如,只有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)
^