C#: Finde die grösste und kleinste Zahl in einem String

Vorgaben

  • Der String enthält nur gültige Zahlen getrennt durch ein Leerzeichen und mindestens eine Zahl
  • Ausgabe ist ein String mit der grössten und kleinsten Zahl

Beispiele

EingabeAusgabe
„1 2 3 4 5 6 7 8 9 10“„10 1“
„-100 99 45 0 1 354“„354 -100“

Meine erste Lösung

public static string HighAndLow(string numbers)
{
    var sortedList = numbers.Split(" ")
                .Select(x => Convert.ToDecimal(x))
                .OrderByDescending(o => o);
    return $"{sortedList.First()} {sortedList.Last()}";
}

Meine zweite optimierte Lösung

public static string HighAndLow(string numbers)
{
    var sortedList = numbers.Split(" ").Select(int.Parse);
    return $"{sortedList.Max()} {sortedList.Min()}";
}

Unit-Test

public void GetHighAndLowTest()
{
    Assert.AreEqual("354 -100", Snippets.HighAndLow("-100 99 45 0 1 354"));
    Assert.AreEqual("10 1", Snippets.HighAndLow("1 2 3 4 5 6 7 8 9 10"));
    Assert.AreEqual("1 1", Snippets.HighAndLow("1"));
    Assert.AreEqual("3002 -68", Snippets.HighAndLow("-68 3001 3 5 -5 " +
        "42 3002 -1 0 0 -9 4 7 4 -4"));
    Assert.AreEqual("42 -9", Snippets.HighAndLow("8 3 -5 42 -1 0 0 -9 4 " +
        "7 4 -4"));
}

C#: Sortiere die Wörter im String anhand ihrer enthaltenen Zahl

Vorgaben

  • Der String enthält verschiedene Wörter, getrennt durch ein Leerzeichen, welche richtig sortiert einen Satz ergeben
  • Jedes Wort hat an beliebiger Stelle eine Zahl, welche die Position im Satz angibt
  • Wenn der Eingabe-String leer ist, gibt die Funktion einen leeren String zurück
  • Der Eingabe-String enthält nur gültige Werte

Beispiel

EingabeAusgabe
Ap7fel h2abe Ic1h un4d Hung3er 5möchte ein6Ic1h h2abe Hung3er un4d 5möchte ein6 Ap7fel

Meine erste Lösung

public static string OrderWordsByNumber2(string words)
{
    if (string.IsNullOrWhiteSpace(words)) return string.Empty;

    return String.Join(" ", words.Split(" ")
        .Select(x => new { word = x, pos = x.First(v => Char.IsDigit(v)) })
        .OrderBy(x => x.pos)
        .Select(x => x.word));
}

Meine zweite optimierte Lösung

public static string OrderWordsByNumber(string words)
{
    if (string.IsNullOrWhiteSpace(words)) return string.Empty;
    return String.Join(" ", words.Split(" ")
        .OrderBy(x => x.ToList().First(v => Char.IsDigit(v))));        }
}

Unit-Test

[Test]
public void DuplicateCountTest()
{
    Assert.AreEqual("1Das is2t ei3ne spannend4e Aufgabe5",
        Snippets.OrderWordsByNumber("Aufgabe5 1Das ei3ne is2t spannend4e"));
    Assert.AreEqual("Ic1h h2abe Hung3er un4d 5möchte ein6 Ap7fel",
        Snippets.OrderWordsByNumber("Ap7fel h2abe Ic1h un4d Hung3er 5möchte ein6"));
    Assert.AreEqual("", Snippets.OrderWordsByNumber(""));
}

C#: String zu „Camel-Case“ konvertieren

Vorgaben

  • Die Funktion entfernt „-„, „_“ und ändert den darauf folgenden Buchstaben auf einen Grossbuchstaben
  • Der erste Buchstaben wird nur grossgeschrieben, wenn dieser bereits im Eingabe-String gross ist

Beispiele

calculate_total-pricecalculateTotalPrice
Get_from-weather_apiGetFromWeatherApi

Meine Lösung

public static string ToCamelCase(string str)
{
    return Regex.Replace(str, @"[-_]\w", delegate(Match matches)
        {
            return matches.ToString().Substring(1).ToUpper();
        });
}

Meine optimierte Lösung

Die Regex Anpassung mit zusätzlichen Klammern @“[-_](\w)“ – Subexpression ermöglicht es, direkt auf den gesuchten Buchstaben zuzugreifen.

public static string ToCamelCase(string str)
{
    return Regex.Replace(str, @"[-_](\w)", delegate (Match matches)
    {
        return matches.Groups[1].Value.ToUpper();
    });
}

Meine zweite optimierte Lösung

Das „Delegate“ kann auch mit „Lambda expressions“ geschrieben werden.

Lambda expression

public static string ToCamelCase(string str)
{
    return Regex.Replace(str, @"[-_](\w)", 
        m => m.Groups[1].Value.ToUpper());
}

Unit-Test

public void ToCamelCaseTest()
{
    Assert.AreEqual("calculateTotalPrice", 
        Snippets.ToCamelCase("calculate_total-price"));
    Assert.AreEqual("GetFromWeatherApi", 
        Snippets.ToCamelCase("Get_from-weather_api"));
}

Nützliches

Tool for building and testing regular expressions on the .NET regex engine: http://regexstorm.net/tester

C#: Finde die Anzahl mehrfach vorhandenen alphanumerischer Zeichen oder Zahlen in einem String

Vorgaben

  • Gross- Kleinschreibung spielt keine Rolle
  • String enthält nur alphanumerische Zeichen oder Zahlen

Beispiele

StringRückgabe der Funktion
„abcde“0
„aacDeii“2
„Aaahjkl“1

Meine erste Lösung

public static int DuplicateCount(string str)
{
    var charAmounts = str.GroupBy(x => x.ToString(),
        StringComparer.CurrentCultureIgnoreCase)
        .Select(x => new { Character = x.Key, Count = x.Count() });

    return charAmounts.Where(x => x.Count > 1).Count();
}

Meine zweite verbesserte Lösung

public static int DuplicateCount(string str)
{
    return str.ToLower().GroupBy(x => x)
        .Where(y => y.Count() > 1).Count();
}

Unit-Test

[Test]
public void DuplicateCountTest()
{
    Assert.AreEqual(0, Snippets.DuplicateCount(""));
    Assert.AreEqual(0, Snippets.DuplicateCount("abcde"));
    Assert.AreEqual(2, Snippets.DuplicateCount("abbcdde"));
    Assert.AreEqual(2, Snippets.DuplicateCount("aabBcde"));
    Assert.AreEqual(2, Snippets.DuplicateCount("Schifffahrt"));
    Assert.AreEqual(3, Snippets.DuplicateCount("Affenbrotbaum"));
    Assert.AreEqual(1, Snippets.DuplicateCount("Nuss"));
    Assert.AreEqual(1, Snippets.DuplicateCount("2mal2"));
    Assert.AreEqual(2, Snippets.DuplicateCount("333Fragen22"));
}

C#: Finde die ungerade oder gerade Zahl in einem Array

Ausgangslage

  • Das Array enthält immer Werte
  • Die Werte können gerade oder ungerade Zahlen sein
  • Möglicher Array Aufbau:
    • x beliebige gerade Zahlen + 1 ungerade Zahl
    • x beliebige ungerade Zahlen + 1 gerade Zahl

Lösungsvorschlag

public static int FindEvenOrOddNumber(int[] numbers)
{
    var oddV = numbers.Where(x => x % 2 != 0).ToList();
    var evenV = numbers.Where(x => x % 2 == 0).ToList();

    return (oddV.Count > 1) ? evenV.First() : oddV.First();
}

Unit-Tests

[Test]
public void FindEvenOrOddNumberTest()
{
    int[] numbers = { 2, -4, 6, 
8, -10, 9, 12, -16 };
    Assert.IsTrue(9 == Snippets.FindEvenOrOddNumber(numbers));
}

[Test]
public void FindEvenOrOddNumberTest2()
{
    int[] numbers = { 222444888, 7, 19, 1979, 89, 1, 25787, 11,1979};
    Assert.IsTrue(222444888 == Snippets.FindEvenOrOddNumber(numbers));
}