Advertisement
Alexxik

Untitled

Sep 17th, 2023 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.28 KB | None | 0 0
  1. // MARK: - 362. Design Hit Counter
  2.  
  3. // - Заполняем массив секундами когда было нажатие
  4. // - Бинарником находим индекс элемента и до самого конца по индексам считаем сколько там элементов
  5.  
  6. class HitCounter {
  7.    
  8.     var hits: [Int] = []
  9.    
  10.     init() {}
  11.    
  12.     func hit(_ timestamp: Int) {
  13.         hits.append(timestamp)
  14.     }
  15.    
  16.  
  17.     // timestamp - временная отметка сейчас
  18.     // надо найти за последние 300 сек
  19.     func getHits(_ timestamp: Int) -> Int {
  20.         // бинарник, например нужно найти кол-во нажатий за последние 350с, тогда 350-300 = 50
  21.         // Нужно найти в массиве 50, узнать его индекс - это будет l и с него до конца считать
  22.  
  23.         var left = 0
  24.         var right = hits.count - 1
  25.        
  26.         let target = timestamp - 300
  27.         // двигаем указатели, пока границы не будут удовлетворять промежутку
  28.         // left - должен быть настолько маленьким, насколько возможно
  29.  
  30.         // Имея число(target) нужно найти его индекс в массиве      
  31.         while left <= right {
  32.             let mid = (left+right)/2
  33.            
  34.             // тут <= так как когда найдем, нужно это число не включать (left должен быть +1)
  35.             // [1, 2, 3, ..., 301] - за последние 300 секунд - это 301-300 = 1
  36.             // надо считать от 1, не включая ее - [2, 3, ..., 301]
  37.  
  38.             if hits[mid] <= target {
  39.                 left = mid + 1
  40.             } else if hits[mid] > target {
  41.                 right = mid - 1
  42.             }
  43.         }
  44.  
  45.         // вычитаем так как хотим найти кол-во переходящих секунд между
  46.         return hits.count - left
  47.     }
  48. }
  49.  
  50. let counter = HitCounter()
  51. counter.hit(1)
  52. counter.hit(2)
  53. counter.hit(3)
  54. counter.getHits(4)
  55. counter.hit(300)
  56. counter.getHits(300)
  57. counter.getHits(301)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement