Вывод уникальных значений массива C#
Ваша программа так же получает на вход два числа в строковом формате, но теперь они могут быть разной длины. Найдите все уникальные элементы первого числа (значения, которые встречаются только 1 раз в обоих массивах)
Пример:
12335
1458
В данном случае уникально число 2 - оно существует в одном экземпляре 1 и 5 есть во втором массиве, а 3 встречается дважды в первом
В итоге ответ:
"Уникально число 2".
я написал следующий код
using System;
using System.Collections.Generic;
using System.Linq;
public class MainClass
{
public static void Main()
{
string num1 = Console.ReadLine();
string num2 = Console.ReadLine();
string allnum = num1 + num2;
var diff = allnum.Except(num2);
foreach (var s in diff)
Console.WriteLine($"Уникально число {s} ");
}
}
Как убрать из ответа повторяющиеся значения, так как они не будут являться уникальными?
Ответы (3 шт):
namespace UniqueChars_v0
{
public sealed class UniqueChars
{
public readonly int[] CharCounters;
public UniqueChars(string firstString, string secondString)
{
CharCounters = new int[128];
// if (firstString is not null)
if (!object.ReferenceEquals(firstString, null))
{
for (int i = 0; i < firstString.Length; i++)
CharCounters[firstString[i]]++;
// if (secondString is not null)
if (!object.ReferenceEquals(secondString, null))
for (int i = 0; i < secondString.Length; i++)
if (CharCounters[secondString[i]] > 0)
CharCounters[secondString[i]]++;
}
}
[CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool HasUniqueChar(int charIndex)
{
return CharCounters[charIndex] == 1;
}
[CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool HasUniqueNumber(int charIndex)
{
return charIndex >= '0' && charIndex <= '9'
&& CharCounters[charIndex] == 1;
}
public sealed override string ToString()
{
var sb = new System.Text.StringBuilder("[ ");
for (int i = 0; i < CharCounters.Length; i++)
if (HasUniqueChar(i)) { sb.Append((char)i).Append(' '); }
return sb.Append(']').ToString();
}
public string UniqueNumbersToString()
{
var sb = new System.Text.StringBuilder("[ ");
for (int i = '0'; i <= '9'; i++)
if (HasUniqueChar(i)) { sb.Append((char)i).Append(' '); }
return sb.Append(']').ToString();
}
}
}
Usage and Tests
Output
var unique0 = new UniqueChars(null, null);
System.Console.WriteLine(unique0); [ ]
var unique1 = new UniqueChars("", "");
System.Console.WriteLine(unique1); [ ]
var unique2 = new UniqueChars("0", "0");
System.Console.WriteLine(unique2); [ ]
var unique3 = new UniqueChars("12345", "12345");
System.Console.WriteLine(unique3); [ ]
var unique4 = new UniqueChars("12335", "1458");
System.Console.WriteLine(unique4); [ 2 ]
System.Console.WriteLine(unique4.UniqueNumbersToString()); [ 2 ]
System.Console.WriteLine(unique4.HasUniqueNumber('1')); False
System.Console.WriteLine(unique4.HasUniqueNumber('2')); True
var unique5 = new UniqueChars("Hello", "World");
System.Console.WriteLine(unique5); [ H e ]
System.Console.WriteLine(unique5.HasUniqueChar('e')); True
System.Console.WriteLine(unique5.HasUniqueNumber('e')); False
var unique6 = new UniqueChars("Ticket 12335", "Ticket 1458");
System.Console.WriteLine(unique6); [ 2 ]
var unique7 = new UniqueChars("tICKET 12335", "Ticket 1458");
System.Console.WriteLine(unique7); [ 2 C E I K ]
System.Console.WriteLine(unique7.UniqueNumbersToString()); [ 2 ]
Кол-во символов в строке можно проверить, деля строку методом Split(), по размеру Length полученного массива разделенных частей исходной строки. Если символ делит строку на более чем две части, то соответственно таких символов в строке несколько. Один символ делит строку на две части.
string.Concat(num1.Except(num2).Where(c => num1.Split(c).Length == 2));
Строка это массив символов, поэтому для того чтобы использовать Except правильно, вы можете ваши строки преобразовать сперва в массивы и получить вашу заветную разницу. upd. Удаляем дубликаты из первой строки Пример кода
var items1 = "12335".Select(x=> x).GroupBy(x=> x).Where(x=> x.Count() == 1).Select( x=> x.Key);
var items2 = "1458".Select(x=> x);
foreach(var c in items1.Except(items2))
Console.WriteLine(c);