Loading...
Elena123456 avatar Elena123456 235 Точки

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 2422 Точки
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 235 Точки

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 756 Точки

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

 

 

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 235 Точки

Здравей @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 756 Точки

Да,така е.

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

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

https://pastebin.com/tiGcXTKw

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

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

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 235 Точки

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

Установих, че с използването на речник много лесно можеш да разбереш кои елементи по колко пъти се съдържат в даде масив/лист. Ако се изисква  да принтираш елементите, които се съдържат два пъти, просто речника се филтрира по 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.