Skip to content

Instantly share code, notes, and snippets.

@jbrains
Forked from aswhitehouse/NonRepeatingNumbers.cs
Last active July 20, 2018 21:21
Show Gist options
  • Select an option

  • Save jbrains/b428e1309d1dc8a71ed9c224cfeac59d to your computer and use it in GitHub Desktop.

Select an option

Save jbrains/b428e1309d1dc8a71ed9c224cfeac59d to your computer and use it in GitHub Desktop.

Revisions

  1. jbrains revised this gist Jul 20, 2018. 1 changed file with 7 additions and 1 deletion.
    8 changes: 7 additions & 1 deletion NonRepeatingNumbers.cs
    Original file line number Diff line number Diff line change
    @@ -55,7 +55,13 @@ public void RepeatingNumber_ArrayContainsANegativeNonRepeating_ReturnNegativeThr
    {
    Assert.True(FirstNonRepeatingNumber(new[] {2,2,-3,6,6}).Value == -3);
    }


    [Test]
    public void OnlyRepeatingNumbers_NotAllMerelyDuplicated()
    {
    Assert.False(FirstNonRepeatingNumber(new int[] {3,3,5,3,5}).HasValue);
    }

    private Maybe<int> FirstNonRepeatingNumber(IReadOnlyList<int> ints)
    {
    if (!ints.Any()) return Maybe<int>.None;
  2. @aswhitehouse aswhitehouse created this gist Jul 14, 2018.
    89 changes: 89 additions & 0 deletions NonRepeatingNumbers.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,89 @@
    using System.Collections.Generic;
    using System.Linq;
    using NUnit.Framework;

    //Using Maybe.cs
    namespace ArrayStructure
    {
    [TestFixture]
    public class Tests
    {
    [Test]
    public void RepeatingNumber_EmptyArray_ReturnsNone()
    {
    Assert.False(FirstNonRepeatingNumber(new int[] {}).HasValue);
    }

    [Test]
    public void RepeatingNumber_ArrayContainsOneValue_ReturnThatValue()
    {
    Assert.True(FirstNonRepeatingNumber(new[] {1}).Value == 1);
    }

    [Test]
    public void RepeatingNumber_ArrayContains_Two_NonRepeatingNumbers_ReturnTheFirst()
    {
    Assert.True(FirstNonRepeatingNumber(new[] {1,2}).Value == 1);
    }

    [Test]
    public void RepeatingNumber_ArrayContainsTwoReapeating_OneNon_ReturnNonRepeating()
    {
    Assert.True(FirstNonRepeatingNumber(new[] {1,1,2}).Value == 2);
    }

    [Test]
    public void RepeatingNumber_ArrayContainsThreeRepeating_NoNon_ReturnNone()
    {
    Assert.False(FirstNonRepeatingNumber(new[] {1,1,2,2,3,3}).HasValue);
    }

    [Test]
    public void RepeatingNumber_ArrayContainsManyMultipleRepeating_ReturnNon_Performs()
    {
    Assert.True(FirstNonRepeatingNumber(new[] {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1}).Value == 2);
    }

    [Test]
    public void RepeatingNumber_ArrayContainsUnOrderedInvariants_ReturnTwo()
    {
    Assert.True(FirstNonRepeatingNumber(new[] {1,3,5,3,1,2,5}).Value == 2);
    }

    [Test]
    public void RepeatingNumber_ArrayContainsANegativeNonRepeating_ReturnNegativeThree()
    {
    Assert.True(FirstNonRepeatingNumber(new[] {2,2,-3,6,6}).Value == -3);
    }

    private Maybe<int> FirstNonRepeatingNumber(IReadOnlyList<int> ints)
    {
    if (!ints.Any()) return Maybe<int>.None;

    var duplicates = new List<int>();

    for (var i = 0; i < ints.Count; i++)
    {
    for (var j = i+1; j < ints.Count; j++)
    {
    if (ints[i] == ints[j])
    {
    duplicates.Add(ints[i]);
    }
    }
    }

    var nonDuplicates = ints.ToList();
    if (duplicates.Count == (double)nonDuplicates.Count / 2)
    {
    return Maybe<int>.None;
    }

    foreach (var item in duplicates)
    {
    nonDuplicates.RemoveAll(x => x == item);
    }
    return Maybe<int>.Some(nonDuplicates[0]);
    }
    }
    }