Advertisement
Gistrec

Yandex interview [2]

Mar 5th, 2020
3,680
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.17 KB | None | 0 0
  1. // Дан не пустой массив из нулей и единиц. Нужно определить, какой максимальный по длине подинтервал единиц можно получить, удалив ровно один элемент массива.
  2. int getMaxLength(const std::vector<int>& arr) {
  3.     size_t maxLength = 0U;
  4.    
  5.     size_t lastZeroIndex;
  6.    
  7.     size_t length = 0U;
  8.     bool isZeroMissed = false;
  9.    
  10.     for (size_t i = 0U; i < arr.size(); ++i) {
  11.         if (arr[i] == 0) {
  12.             if (isZeroMissed) {
  13.                 if (length > maxLength) maxLength = length;
  14.                 i = lastZeroIndex;
  15.                 length = 0U;
  16.                 isZeroMissed = false;
  17.             }else {
  18.                 lastZeroIndex = i;
  19.                 isZeroMissed = true;
  20.             }
  21.         }else {
  22.             length += 1U;
  23.         }
  24.     }
  25.    
  26.     if (length > maxLength) maxLength = length;
  27.    
  28.     if (maxLength == arr.size()) maxLength -= 1;
  29.    
  30.     return maxLength;
  31. }
  32. // Проверка:
  33. // {1} => 0
  34. // {0} => 0
  35. // {1, 1, 1} => 2
  36. // {0, 0, 0} => 0
  37. // {1, 0, 1, 1} => 3
  38. // {0, 1, 1, 0} => 2
  39. // {1, 0, 0, 1} => 1
  40.  
  41.  
  42.  
  43.  
  44.  
  45. // Дан текст T и строка S. Требуется найти подстроку S' в T такую, что она совпадает с S с точностью до перестановки букв.
  46. bool getSubstr(conts std::string& text, conts std::string& str) {
  47.     if (str.size() > text.size()) return false;
  48.    
  49.     // key - символ, value - кол-во вхождение в строку
  50.     const std::unordered_map<char, int> needle;
  51.     for (auto symbol : str) {
  52.         needle[symbol]++;
  53.     }
  54.    
  55.     std::unordered_map<char, int> haystack;
  56.     for (size_t i = 0U; i < str.size(); ++i) {
  57.         char symbol = text[i];
  58.         haystack[symbol]++;
  59.     }
  60.    
  61.     for (size_t i = 0U; i < text.size() - str.size(); ++i) {
  62.         if (needle = haystack) return true;
  63.        
  64.         // Убираем первый символ из подстроки в тексте
  65.         auto it = haystack.find(text[i]);
  66.         if (it->second == 1) {
  67.             haystack.erase(it);
  68.         }else {
  69.             (it->second)--;
  70.         }
  71.        
  72.         // Добавляем новый символ
  73.         auto symbol = text[i + str.size()];
  74.         haystack[symbol]++;
  75.     }
  76.    
  77.     if (needle = haystack) return true;
  78.    
  79.     return false;
  80. }
  81. // Проверка:
  82. // "a"    "a"    => true
  83. // "abcd", "aaa" => false ?
  84. // "abcd", "cbd" => true
  85. // "abcdda", "bcdd" => true ?
  86.  
  87.  
  88.  
  89.  
  90. // Развернуть односвязанный список
  91. struct ListNode {
  92.     ListNode* next;
  93. }
  94.  
  95. ListNode* getReverse(ListNode* list) {
  96.     if (list == nullptr) return nullptr;
  97.    
  98.     ListNode* prev     = nullptr;
  99.     ListNode* current  = list;
  100.     ListNode* next     = list->next;
  101.    
  102.     while (next != nullptr) {
  103.         current->next = prev;
  104.        
  105.         prev    = current;
  106.         current = next;
  107.         next    = next->next;
  108.     }
  109.    
  110.     current->next = prev;
  111.    
  112.     return current;
  113. }
  114.  
  115.  
  116.  
  117.  
  118.  
  119. // Дано дерево с выделенным корнем.
  120. // Далее приходит K запросов, каждый запрос - целое неотрицательное число,
  121. // расстояние от корня. Для каждого запроса нужно найти сумму элементов в дереве
  122. // на расстоянии от корня не более заданного.
  123. struct Node {
  124.     int value;
  125.     Node* l;
  126.     Node* r;
  127. };
  128.  
  129. class Handler {
  130. private:
  131.     // Для каждого уровня храним сумму элементов
  132.     std::unordered_map<size_t, int> _sum;
  133.  
  134.     size_t _maxLevel;
  135.  
  136.     void calculateDepthSum(Node* node, size_t level) {
  137.         if (node == nullptr) return;
  138.        
  139.         if (level > max_Level) _maxLevel = level;
  140.        
  141.         _sum[level] += node->value;
  142.        
  143.         calculateDepthSum(node->r, level + 1);
  144.         calculateDepthSum(node->l, level + 1);
  145.     }
  146.    
  147.     void calculateTotalSum() {
  148.         for (size_t level = 0U; level < _maxLevel; ++level) {
  149.             _sum[level + 1U] += _sum[level];
  150.         }
  151.     }
  152.  
  153. public:
  154.     void init(Node* tree) {
  155.         _maxLevel = 0U;
  156.         _sum[0U]  = 0;
  157.  
  158.         calculateDepthSum(tree, 0U);
  159.         calculateTotalSum();
  160.     }
  161.    
  162.    
  163.     int sum(size_t level) const {
  164.         if (level > _maxLevel) return _sum[_maxLevel];
  165.        
  166.         return _sum[level];
  167.     }
  168. };
  169. // Проверка:
  170. //       1
  171. //   2       3
  172. // 4   5  
  173. //        6
  174. // _maxLevel = 3
  175. // _sum[0U] = 1
  176. // _sum[1U] = 5 + 1
  177. // _sum[2U] = 9 + (5 + 1)
  178. // _sum[3U] = 6 + (9 + 5 + 1)
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186. // Дано бинарное дерево с выделенным корнем, в каждой вершине которого записано по одной букве A-Z.
  187. // Две вершины считаются эквивалентными, если поддеревья этих вершин содержат одинаковое множество (т.е. без учета частот) букв.
  188. // Нужно найти любую пару эквивалентных вершин.
  189. struct TNode {
  190.     char Value;
  191.     TNode* Left = nullptr;
  192.     TNode* Right = nullptr;
  193. };
  194.  
  195. std::unordered_multimap<int, Node*> set;
  196.  
  197. std::pair<TNode*, TNode*> FindEquivalentSubtrees(TNode* root) {
  198.     int value = 0U;
  199.  
  200.     if (root->Left != nullptr) {
  201.         int left = FindEquivalentSubtrees(root->Left);
  202.    
  203.        
  204.         auto it = set.find(left);
  205.         if (it != set.end()) {
  206.             return {*it, root};
  207.         }else {
  208.             value |= left;
  209.         }
  210.     }
  211.     if (root->Right != nullptr) {
  212.         int right = FindEquivalentSubtrees(root->Right);
  213.        
  214.         auto it = set.find(right);
  215.         if (it != set.end()) {
  216.             return {*it, root};
  217.         }else {
  218.             value |= rigth;
  219.         }
  220.     }
  221.    
  222.     // Добавляем бит у индекса root->value;
  223.     value |= 1 << (root->Value - 'A');
  224.    
  225.     return value;
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement