Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace SliceArray
- {
- class Program
- {
- static void Main(string[] args)
- {
- var arr = new[] {5, 5, 3, 4, 5, 2, 3, 5};
- var n = arr.Length;
- int resultIndex = -1;
- var counts = new Dictionary<int, int>(); //= arr.GroupBy(x => x).ToDictionary(group => group.Key, group => group.Count());
- // заполнить словарь [элемент : количество в массиве] ----> первый проход
- for (int i = 0; i < n; i++)
- {
- if (!counts.ContainsKey(arr[i])) counts[arr[i]] = 0;
- counts[arr[i]]++;
- }
- var countsCopy = new Dictionary<int, int>(counts);
- // заполняем доп массив, где хранится количество элементов равных данному слева от него ----> второй проход
- var leftCounts = new int[n];
- for (int i = n - 1; i >= 0; i--)
- {
- leftCounts[i] = --countsCopy[arr[i]];
- }
- // countsCopy после этого обнуляется
- // теперь собственно поиск ----> третий проход
- // шагаем до совпадения числа в leftCounts и количества оставшихся других элементов
- for (int i = 0; i < n; i++)
- {
- countsCopy[arr[i]]++; // запоминаем, сколько чисел уже прошли
- // если в массиве 0, то слева нет таких же элементов, как текущий, значит можно забить
- if (leftCounts[i] == 0) continue;
- // ищем количество других элементов справа
- // то есть разницу между общим количеством элементов справа от текущего
- // и количеством оставшихся элементов равных данному
- var rightCount = (n - (i + 1)) - (counts[arr[i]] - countsCopy[arr[i]]);
- if (leftCounts[i] == rightCount)
- {
- resultIndex = i;
- break;
- }
- }
- if (resultIndex == -1)
- Console.WriteLine("Fail");
- else
- {
- Console.WriteLine("index: {0}, element: {1}", resultIndex, arr[resultIndex]);
- Console.WriteLine("Splitted [" + String.Join(" ", arr) + "]");
- Console.WriteLine("Into [{0}] [{1}]",
- String.Join(" ", arr.Take(resultIndex)),
- String.Join(" ", arr.Skip(resultIndex+1)));
- }
- Console.ReadLine();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement