Профил
Loading...
+ Нов въпрос
Elena123456 avatar Elena123456 98 Точки

Print all unique elements in the array/list

Здравейте, днес попаднах на следната задача:

Print all unique elements in an array.

input:

1 2 3 4 5 5 5 6

output:

1 2 3 4 6

 

Запознах се с Distinct(), но с него принтирам само това "1 2 3 4 5 6". Има ли някакъв друг подобен метод, с които да кажа, че искам числата да се запишат в нов лист, но само ако не се повтарят, потретват и пр. в първоначалния лист? И разбира се кода да е разбираем за човек, който е на ниво Fundamental, защото всички решения, които прегледах досега в stackoverflow  бяха напълно неразбираеми. :)

Все пак мисля, че успях да измисля някакво решение само с Destinct плюс още един допълнителен for цикъл. Понеже нямам Judge за тази задача не съм сигурна дали не би се счупила програмата  с някой инпут. И вече установих, че при инпут 1 1 2 2 6, принтирам 2 6, вместо само 6.

using System;
using System.Collections.Generic;
using System.Linq;


namespace W3resourceArrayExe
{
    class MainClass
    {
        public static void Main(string[] args)
        {

            Console.Write("Input the number of elements to be stored in the first array: ");
            int input = int.Parse(Console.ReadLine());
            Console.WriteLine($"Input {input} elements in the array:");
            var firstList = new List<string>();

            for (int i = 0; i < input; i++)
            {

                Console.Write($"element-{i} : ");
                string num = Console.ReadLine();
                firstList.Add(num);
             }

            var newListDestinct = firstList.Distinct().ToList();
            for (int i = 0; i < newListDestinct.Count; i++)
            {
                int counter = -1;

                for (int k = 0; k < firstList.Count; k++)
                {
                    if (newListDestinct[i] == firstList[k])
                    {
                        counter++;
                    }
                    if (counter > 0)
                    {
                        newListDestinct.RemoveAt(i);
                        break;

                    }
                }
            }

            Console.WriteLine(string.Join(" ",newListDestinct));
        }
    }
}
 

 

Тагове:
0
Fundamentals Module 12/09/2020 01:52:23
Axiomatik avatar Axiomatik 576 Точки
Best Answer

This should do the trick, but such detailed Where() queries are not needed for the C# Fundamentals and C# Advanced exams. It's only starting from C# DB, that will require more elaborated Where() validations. Nice comments on Array-Manipulator!

Best,

using System;
using System.Linq;
using System.Collections.Generic;


namespace W3resourceArrayExe
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.Write("Input the number of elements to be stored in the first array: ");

            int[] input = Console.ReadLine()
                .Split(" ", StringSplitOptions.RemoveEmptyEntries)
                .Select(int.Parse)
                .ToArray();

            Console.WriteLine($"Input {input.Length} elements in the array:");

            var newListDestinct = input.Where(x =>
            {
                int currentNum = x;
                int count = 0;

                for (int i = 0; i < input.Length; i++)
                {
                    if (input[i] == currentNum)
                    {
                        count++;
                    }
                }

                return count == 1;
            }).ToList();


            Console.WriteLine(string.Join(" ", newListDestinct));
        }
    }
}

1
Elena123456 avatar Elena123456 98 Точки

Hi again Axiomatik and thanks for your comment!

I see such complex Where() queries definitely are not for somebody from Fundamental module, but this information will be very usefull for me in the future.

Few hours ago I was trying to solved this exercise only with loops and maybe now it's working correctly, althout I'am not  very sure but I have tested with 15 different inputs.

And thanks for your positive feedback about Array Manipulator. Maybe it will be easier for samebody to correct their code. :)

Best regards!

Elena

 

using System;
using System.Collections.Generic;
using System.Linq;


namespace W3resourceArrayExe
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var listCount = int.Parse(Console.ReadLine());
            var firstList = new List<int>();

            for (int i = 0; i < listCount; i++)
            {
               int num = int.Parse(Console.ReadLine());
                firstList.Add(num);
            }

            Console.WriteLine(string.Join(" ",firstList));
            var newListDestinct = firstList.Distinct().ToList();
            Console.WriteLine( string.Join(" ", newListDestinct));

            int counter = 0;
            for (int i = 0; i < newListDestinct.Count; i++)
            {


                for (int k = 0; k < firstList.Count; k++)
                {

                    if (newListDestinct[i] == firstList[k])
                    {
                        counter++;
                    }

                    if (counter == 2)
                    {
                        newListDestinct.Remove(newListDestinct[i]);
                        i = -1;
                        counter = 0;
                        break;
                    }
                }

                counter = 0;

                }

            if (newListDestinct.Count == 0)
            {
                Console.WriteLine("There are no unique elements!");
            }

            else
            {
                Console.WriteLine(string.Join(" ", newListDestinct));
            }

          }

        }
    }
 

1
krum_43 avatar krum_43 422 Точки

Ето едно кратко решение и от мен:

 

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace Unicueelements
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            List<int> inputList = input.Split().Select(int.Parse).ToList();
            List<int> newList = new List<int>();
            newList.Add(inputList[0]);
            for (int i = 1; i <inputList.Count;i++)
            {
                if(!newList.Contains(inputList[i]))
                {
                    newList.Add(inputList[i]);
                }
            }
            Console.WriteLine(String.Join(" ",newList));
        }
    }
}
 

1
14/09/2020 15:41:53
Elena123456 avatar Elena123456 98 Точки

Здравей @krum_43,

благодаря за включването. :)

Може би аз не съм задала достатъчно ясно условието.

При инпут: "1 1 1 2 3 4" аз искам само 2 3 4, т.е ако даден елемент от първоначалния лист се повтаря, потретва и пр. аз не искам да го принтирам във втория лист, защото той не е уникален по условие.

Случайно все още написания с молив лист А4 с инпутите и аутпутите на тази задача стой на бюрото ми. :)

инпут-----аутпут

1 1 1 2 3 4--- 2 3 4

2 3 4 1 1 1--- 2 3 4

2 3 1 1 1 4---- 2 3 4

2 1 3 1 1 4---- 2 3 4

1 2 1 1 3 4---- 2 3 4

2 1 1 3 1 4----- 2 3 4

2 1 1 3 4 1---- 2 3 4

1 1 1 2 2 2 3 4--- 3 4

1 1 1 3 4 2 2 2---- 3 4

3 4 1 1 1 2 2 2---- 3 4

3 1 1 1 2 2 4 2---- 3 4

3 1 1 1 2 2 2 4---- 3 4

1 1 1 2 2 2 3 4---- 3 4

1 1 2 3 2 4 1 1---- 3 4

 

Здравей @Drakojan,

да, при повторно тестване разбрах, че не връщам for цикъла от 0. И преди няколко дена коригирах кода си (втория ми пост) и работи коректно, поне с въпросните инпути. Но благодаря за забележката, тъкмо вече се надявам,че ще го имам предвид още преди тестването. :)

 

Поздрави!

 

 

 

0
14/09/2020 22:17:32
krum_43 avatar krum_43 422 Точки

Да,така е.

Забелязах грешката още вчера,но ме домързя да я корегирам.

Ето ти един код,който принтира само уникалните елементи:

https://pastebin.com/tiGcXTKw

1
15/09/2020 10:06:31
nickwork avatar nickwork 655 Точки

Като вариант може и така :)

static void Main( )
        {
            List<int> numbers = Console.ReadLine().Split().Select(int.Parse)
                .GroupBy(x => x)
                .Where(x => x.Count() == 1)
                .Select(x => x.Key)
                .ToList();

            Console.WriteLine(string.Join(" ", numbers));
        }

2
Drakojan avatar Drakojan 13 Точки

Привет,

Проблемът е че модифицираш колекцията newListDestinct докато я циклиш. В момента, в който махнеш елемента примерно на индекс 4 елемента, който е бил на индекс 5 заема неговото място. Когато след това отидеш в поредната итерация на цикъла i вече ще е 5, а елемента който е бил на индекс 5 е вече на индекс 4 и по този начин го пропускаш. Може да се реши като коригираш стойността на i с "i--", в момента, в който модифицираш колекцията: 

                    if (counter > 1)
                    {
                        newListDestinct.RemoveAt(i);
                        i - - ;
                        break;

                    }

1
Elena123456 avatar Elena123456 98 Точки

Още едно решение, след като взех вече и речниците. Мисля, че работи и съм щастлива за което. :)

Установих, че с използването на речник много лесно можеш да разбереш кои елементи по колко пъти се съдържат в даде масив/лист. Ако се изисква  да принтираш елементите, които се съдържат два пъти, просто речника се филтрира по x.Value==2. Ако се искат тези, които се съдържат три пъти, се филтрира по x.Value==3 и пр.

Хубав неделен ден от мен! :)

using System;
using System.Collections.Generic;
using System.Linq;

namespace Dictionary
{
    class MainClass
    {
        public static void Main()
        {
            int[] numbers = Console.ReadLine().Split().Select(int.Parse).ToArray();

            Dictionary<int, int> dictionary = new Dictionary<int, int>();

            for (int i = 0; i <= numbers.Length-1; i++)
            {
                if (dictionary.ContainsKey(numbers[i]) == false)
                {
                    dictionary[numbers[i]] = 1;
                }

                else
                {
                    dictionary[numbers[i]]++;
                }
            }

          var filteredDict = dictionary.Where(x => x.Value == 1).ToDictionary(x=> x.Key, x=> x.Value);
          Console.WriteLine(string.Join(" ", filteredDict.Keys));
        }

      }

    }

 


   
 

 

 

0
25/10/2020 12:29:51