Home > database >  Write a program that removes from a given sequence all numbers that appear an odd count of times
Write a program that removes from a given sequence all numbers that appear an odd count of times

Time:05-19

net from Nakov's Fundamental of computer Programming. Just finished Linear data structures chapter and got stuck with the question. After several attempts I have written this code. Though it gives the desired result. Need help to know how this modified to be more efficient without using hash table.

class RemoveNumberAppearingOddCountTimes
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enter a List of Random integers such that some of them appears Odd times");
        List<int> myList = new List<int>();
        ValidatingList(myList);
        CheckIfOddCount(myList);
        int i = 0;
        do
        {
            Console.WriteLine(myList[i]);
            i  ;
        }
        while (i != myList.Count);
        
        Console.ReadLine();
    }
    public static List<int> ValidatingList(List<int> list)
    {
        string input = Console.ReadLine();

        while (input != "")
        {
            try
            {
                list.Add(int.Parse(input));
            }
            catch (FormatException Fe)
            {
                Console.WriteLine(Fe.Message);
            }
            catch (OverflowException OFe)
            {
                Console.WriteLine(OFe.Message);
            }
            input = Console.ReadLine();
        }
        return list;
    }
    public static List<int> CheckIfOddCount(List<int> InputList)
    {
        int AppearCount = 1;
        bool result = false;
        int checkvalue = 0;
        int i = 0;
        for (; i < InputList.Count;i   )
        {
            checkvalue = InputList[i];
           for (int start = 0; start < InputList.Count;start  )
            {
                if (InputList[i] == InputList[start] && start != i)
                {
                    AppearCount  ;
                }
            }
            result = IsOdd(AppearCount);
            if (result == true)
            {
                InputList = OddNumberRemoveFromList(InputList[i], InputList);
                i = 0;
                AppearCount = 1;
            }
            else
            {
                AppearCount = 1;
            }
        }
        return InputList;
    }
    public static List <int> OddNumberRemoveFromList(int number, List<int> RemoveFromList)
    {
        for (int i = 0; i <RemoveFromList.Count; )
        {
            if (RemoveFromList[i] == number)
            {
                RemoveFromList.RemoveAt(i);
                i = 0;
            }
            else i  ;
        }
        return RemoveFromList;    
    }
    public static bool IsOdd(int ApearCount)
    {
        if (ApearCount % 2 != 0)
        {
           return true;
        }
        else return false;    
    
    }
}

CodePudding user response:

You can use Dictionary<int,int> to keep track of how many times each number appears during input already.

Assume You have empty Dictionary<int,int> counts = new(); When You input a number input, instead of putting it to a list, You just increment a count on the dictionary entry, ie

if (counts.ContainsKey(input))
   counts[input]  ;
else
   counts[input] = 1;

After that just iterate over Dictionary and print values with odd counts

foreach (var keyValue in counts)
  if (keyValue.Value % 2 == 0)
    Console.WriteLine(keyValue.Key);

Or even better - use a Dictionary<int,bool> to just keep track which entries appear odd number of times

Dictionary<int,bool> isOdd = new();

/// process input

if (!isOdd.Contains(input))
   isOdd[input] = false;
else 
   isOdd[input] = !isOdd[input];

CodePudding user response:

In the real World one would just do

return InputList.Where(z => InputList.Count(y => y == z) % 2 == 0);
  • Related