Mam problemy z zliczaniem unikatowych wartości w tablicy i muszę to zrobić bez zmiany rozmieszczenia elementów tablicy.Jak mogę policzyć unikalne liczby w tablicy bez zmiany rozmieszczenia elementów tablicy?
Jak mogę to zrobić?
Mam problemy z zliczaniem unikatowych wartości w tablicy i muszę to zrobić bez zmiany rozmieszczenia elementów tablicy.Jak mogę policzyć unikalne liczby w tablicy bez zmiany rozmieszczenia elementów tablicy?
Jak mogę to zrobić?
Jeśli masz .NET 3.5 można łatwo osiągnąć z LINQ poprzez:
int numberOfElements = myArray.Distinct().Count();
Non LINQ:
List<int> uniqueValues = new List<int>();
for(int i = 0; i < myArray.Length; ++i)
{
if(!uniqueValues.Contains(myArray[i]))
uniqueValues.Add(myArray[i]);
}
int numberOfElements = uniqueValues.Count;
Jeśli jest to zadanie domowe, to odpowiedź nie jest prawdopodobna, aby uzyskać mu wiele punktów, ale nadal dobrą odpowiedź pod względem linq. – andleer
@Andrew Dodano przykład pracy domowej bez LINQ. –
Przykład inny niż linq jest naprawdę zły, ale pozwólmy Richowi wymyślić lepsze rozwiązanie, jeśli rzeczywiście jest to zadanie domowe. :) (WSKAZÓWKA: Jak można uniknąć konieczności powtarzania całej tablicy dla każdego elementu?) – Arafangion
To jest o wiele bardziej efektywne wdrożenie non LINQ.
var array = new int[] { 1, 2, 3, 3, 3, 4 };
// .Net 3.0 - use Dictionary<int, bool>
// .Net 1.1 - use Hashtable
var set = new HashSet<int>();
foreach (var item in array) {
if (!set.Contains(item)) set.Add(item);
}
Console.WriteLine("There are {0} distinct values. ", set.Count);
Dlaczego
Pod względem wydajności powinny być identyczne, czyszczone, aby używać HashSet, aby kod demonstracyjny wyglądał mniej brzydko. –
Słownik powinien znajdować się znacznie szybciej na dużych tablicach niż lista zawiera. –
Czy należy liczyć tylko różne wartości lub czy należy liczyć każdą liczbę w tablicy (np. "Numer 5 zawiera 3 razy")?
Drugie wymaganie można spełnić, rozpoczynając kroki algorytmu sortowania zliczania.
To byłoby coś takiego:
Chodzi
wykorzystanie O (n), czas trwania pamięci MAX_VALUE
boolean[] data = new boolean[maxValue];
for (int n : list) {
if (data[n]) counter++
else data[n] = true;
}
to jest domowe? –
on on kinda; P .... – jarus
Nic złego w odrabianiu lekcji ... Pod warunkiem, że nie wystarczy wziąć odpowiedzi takimi, jakimi są. (tzn. Weź odpowiedź i spraw, aby była * lepsza *). – Arafangion