Advertisement
Kant8

pd split array

Jan 10th, 2015
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.07 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace SliceArray
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             var arr = new[] {5, 5, 3, 4, 5, 2, 3, 5};
  14.             var n = arr.Length;
  15.             int resultIndex = -1;
  16.  
  17.            
  18.             var counts = new Dictionary<int, int>(); //= arr.GroupBy(x => x).ToDictionary(group => group.Key, group => group.Count());
  19.  
  20.             // заполнить словарь [элемент : количество в массиве]  ----> первый проход
  21.             for (int i = 0; i < n; i++)
  22.             {
  23.                 if (!counts.ContainsKey(arr[i])) counts[arr[i]] = 0;
  24.                 counts[arr[i]]++;
  25.             }
  26.  
  27.             var countsCopy = new Dictionary<int, int>(counts);
  28.  
  29.             // заполняем доп массив, где хранится количество элементов равных данному слева от него ----> второй проход
  30.             var leftCounts = new int[n];
  31.             for (int i = n - 1; i >= 0; i--)
  32.             {
  33.                 leftCounts[i] = --countsCopy[arr[i]];
  34.             }
  35.             // countsCopy после этого обнуляется
  36.  
  37.             // теперь собственно поиск ----> третий проход
  38.             // шагаем до совпадения числа в leftCounts и количества оставшихся других элементов
  39.             for (int i = 0; i < n; i++)
  40.             {
  41.                 countsCopy[arr[i]]++; // запоминаем, сколько чисел уже прошли
  42.  
  43.                 // если в массиве 0, то слева нет таких же элементов, как текущий, значит можно забить
  44.                 if (leftCounts[i] == 0) continue;  
  45.  
  46.                 // ищем количество других элементов справа
  47.                 // то есть разницу между общим количеством элементов справа от текущего
  48.                 // и количеством оставшихся элементов равных данному
  49.                 var rightCount = (n - (i + 1)) - (counts[arr[i]] - countsCopy[arr[i]]);
  50.  
  51.                 if (leftCounts[i] == rightCount)
  52.                 {
  53.                     resultIndex = i;
  54.                     break;
  55.                 }
  56.             }
  57.  
  58.             if (resultIndex == -1)
  59.                 Console.WriteLine("Fail");
  60.             else
  61.             {
  62.                 Console.WriteLine("index: {0}, element: {1}", resultIndex, arr[resultIndex]);
  63.                 Console.WriteLine("Splitted [" + String.Join(" ", arr) + "]");
  64.                 Console.WriteLine("Into [{0}] [{1}]",
  65.                     String.Join(" ", arr.Take(resultIndex)),
  66.                     String.Join(" ", arr.Skip(resultIndex+1)));
  67.             }
  68.             Console.ReadLine();
  69.         }
  70.     }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement