0

Daily Challenge #3

Witaj! Dzisiaj rozwiążemy zadanie zaproponowane przez Google. Zadanie banalnie proste. Po Google spodziewałbym się czegoś więcej. Wyceniłem je na 1 gwiazdkę.

Tak jak zawsze kod jest dostępny na GitHubie.

Wpis ten należy do cyklu Daily Challenge. W cyklu tym rozwiązuję każdego dnia nowe zadanie. Zadanie te traktuję w taki sposób, jakbym dostał je na rozmowie kwalifikacyjnej i miał coś wymyślić. Implementuję pierwszą myśl jaka przyjdzie mi do głowy. Nie musi być ona (zazwyczaj nie będzie) najlepszym rozwiązaniem. Chodzi po prostu o zabawę i sprawdzenie jakbym sobie poradził z podobnym wyzwaniem. Zaimplementowane rozwiązanie nie jest z reguły tłumaczone, jeżeli masz pytania możesz je zadawać w komentarzach. Wszystkie zadania udostępniane są subskrybentom Daily Coding Problem.

Zadanie

Treść dzisiejszego zadania prezentuje się następująco:

Given a list of numbers and a number k, return whether any two numbers from the list add up to k. For example, given [10, 15, 3, 7] and k of 17, return true since 10 + 7 is 17. Bonus: Can you do this in one pass?

Poważnie? Takie coś od Google? Jedziemy z implementacją.

Testy

Oczywiście najpierw testy (wyrobiłem już w Tobie nawyk?):

[TestMethod]
public void DailyChallenge3()
{
    DailyChallenge3 obj = new DailyChallenge3();
    Assert.IsTrue(obj.Proceed(new int[] { 10, 15, 3, 7 }, 17));
    Assert.IsTrue(obj.Proceed(new int[] { 10, 15, 3, 7 }, 13));
    Assert.IsTrue(obj.Proceed(new int[] { 10, 15, 3, 7 }, 10));
    Assert.IsFalse(obj.Proceed(new int[] { 10, 15, 3, 7 }, 14));
    Assert.IsFalse(obj.Proceed(new int[] { 10, 15, 3, 7 }, 7));
    Assert.IsTrue(obj.Proceed(new int[] { -5, 15, 3, 7 }, 2));
 
    Assert.IsTrue(obj.Proceed(new int[] { 1, 1, 1, 5 }, 6));
    Assert.IsTrue(obj.Proceed(new int[] { 1, 1, 1, 5 }, 2));
    Assert.IsFalse(obj.Proceed(new int[] { 1, 1, 1, 5 }, 3));
}

Nie rozczulałem się za bardzo nad tymi testami, nie przyszło mi dużo przypadków do głowy.

Implementacja

Kod jak wspominałem jest skromny, składa się z 12 linijek 😉:

public bool Proceed(int[] input, int toCheck)
{
    HashSet<int> already = new HashSet<int>();
    foreach (int value in input)
    {
        int sub = toCheck - value;
        if (already.Contains(sub))
        {
            return true;
        }
        already.Add(value);
    }
    return false;
}

Nie ma co się rozpisywać nad tym algorytmem. Jest banalny. Przechodzi wszystkie testy.

Mission Complete

No to było coś! Z drugiej strony dzień relaksu się przyda, będę mógł skupić się na innych artykułach. Mam nadzieję, że w przyszłości zadania będą bardziej wymagające.

Pozdro!

Patryk Bogdański

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.