Поиск в массивые - C#

Узнай цену своей работы

Формулировка задачи:

Доброе время суток. Подкинули задачку которую мне интересно решить но не как не могу. Задача: "У вас есть два массива целых чисел A и В. Массивы не сортированные. Напишите, на любом языке, функцию, которая максимально быстро найдет пересечение этих массивов (список элементов, которые есть в обоих массивах)." Товарищ дал подсказку что это на расчет сложности алгоритма, но поскольку это было еще до армии можно сказать что для меня это не о чем не говорит. Я склепал программу где попытался решить задачку. Вот она:
class Program
    {
        static void Main(string[] args)
        {
            MyArr Arr = new MyArr();
 
            Console.ReadKey();
        }
    }
 
    class MyArr
    {
        private int[] Mas1;
        private int[] Mas2;
        private Random RR = new Random();
        private int magik = 4;
 
        public MyArr()
        {
            Zap();
            /*foreach (int i in Mas1)
            {
                Console.Write(i);
            }
            Console.WriteLine();
            foreach (int i in Mas2)
            {
                Console.Write(i);
            }*/
            Console.WriteLine();
            One();// банальный перебор просто так для сравнения
            Console.WriteLine();
            Two();// сугубо моя попытка ответить на вопрос
            Console.WriteLine();
            //Three(); // не работает
            Console.WriteLine();
            Four();// случайно нашел такой вариант решения но как он работает не разобрал =(
        }
 
        private void Zap()
        {
            Mas1 = new int[ magik ];
            Mas2 = new int[ magik ];
 
            for( int i = 0 ; i < magik ; i++ )
            {
                Mas1[ i ] = RR.Next( magik );
                Mas2[ i ] = RR.Next( magik );
            }
        }
 
        private void One()
        {
            for(int i = 0 ; i < Mas2.Length ; i++ )
            {
                for( int j = 0 ; j < Mas1.Length ; j++ )
                {
                    if( Mas2[ i ] == Mas1[ j ] )
                    {
                        Console.Write( " " + Mas2[ i ] );
                    }
                }
            }
        }
 
        private void Two()
        {
            int i = 0 ;
            do
            {
                for ( int j = 0 ; j < Mas1.Length ; j++ )
                {
                    if  ( Mas2[ i ] == Mas1[ j ] )
                    {
                        Console.Write( " " + Mas2[ i ] );
                        i++;
                        if ( !( i == Mas2.Length ) )
                        {
                            j = -1;
                        }
                        else
                        {
                            j = Mas1.Length - 1;
                        }
                    }
                }
 
                i++;
            } while ( i < Mas2.Length );
        }
 
        private void Three()
        {
// знакомый нашел решение на  JavaScript но у меня ошибка с переполнением вылазит или 0            
/*
            function intersection(A, B)
{
var m = A.length, n = B.length, c = 0, C = [];
for (var i = 0; i < m; i++)
{ 
var j = 0, k = 0;
while (B[j] !== A[ i ] && j < n) j++;
while (C[k] !== A[ i ] && k < c) k++;
if (j != n && k == c) C[c++] = A[ i ];
}
return C;
}
            */
            int m = Mas1.Length , n = Mas2.Length , c = 0;
            int[] Mas3 = { 0 };
 
            for ( int i = 0 ; i < m ; i++ )
            {
                int j = 0, g = 0;
                while( ( Mas2 [ j ] != Mas1[ i ] ) && ( j < n ) )
                {
                    j++;
 
                    while ( ( Mas3[ g ] != Mas1[ i ] ) && ( g < c ) )
                    {
                        g++;
 
                        if ( j != n && g == c )
                        {
                            Array.Resize<int>( ref Mas3 , c++ );
                            Mas3[ c ] = Mas1[ i ];
                        }
                    }
                }
            }
 
            for( int i = 0 ; i < Mas3.Length ; i++ )
            {
                Console.Write( " " + Mas3[ i ] );
            }
        }
 
        private void Four()
        {
            IEnumerable<int> bot = Mas1.Intersect( Mas2 );
            foreach ( int i in bot )
            {
                Console.Write( " " + i );
            }
        }
    }
Люди добрые пожало сто посмотрите где мой косяк в третьем решении и если есть то предложите свой вариант решения.

Решение задачи: «Поиск в массивые»

textual
Листинг программы
static void Main(string[] args)
        {
            int[] a = new[] { 1, 2, 3, 4, 5, 6, 7 };
            int[] b = new[] { 2, 4, 6, 8 };
            var result = GetList(a, b);
            foreach (var i in result)
                Console.Write("{0} ", i);
            Console.ReadLine();
        }
 
        static IEnumerable<int> GetList(IEnumerable<int> a, IEnumerable<int> b)
        {
            foreach (int x in a)
                if (b.Contains(x))
                    yield return x;
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы