From a17847dfdb90cfbc3d8c51da745bfd8b2c3f2956 Mon Sep 17 00:00:00 2001 From: fartem Date: Thu, 10 Oct 2024 10:04:13 +0300 Subject: [PATCH] 2024-10-10 v. 6.7.9: added "284. Peeking Iterator" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/medium/284_peeking_iterator.rb | 47 ++++++++++++++++++++++++ test/medium/test_284_peeking_iterator.rb | 20 ++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 lib/medium/284_peeking_iterator.rb create mode 100644 test/medium/test_284_peeking_iterator.rb diff --git a/README.md b/README.md index c8626e6c..d79eea09 100644 --- a/README.md +++ b/README.md @@ -544,3 +544,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 237. Delete Node in a Linked List | [Link](https://leetcode.com/problems/delete-node-in-a-linked-list/) | [Link](./lib/medium/237_delete_node_in_a_linked_list.rb) | [Link](./test/medium/test_237_delete_node_in_a_linked_list.rb) | | 238. Product of Array Except Self | [Link](https://leetcode.com/problems/product-of-array-except-self/) | [Link](./lib/medium/238_product_of_array_except_self.rb) | [Link](./test/medium/test_238_product_of_array_except_self.rb) | | 240. Search a 2D Matrix II | [Link](https://leetcode.com/problems/search-a-2d-matrix-ii/) | [Link](./lib/medium/240_search_a_2d_matrix_ii.rb) | [Link](./test/medium/test_240_search_a_2d_matrix_ii.rb) | +| 284. Peeking Iterator | [Link](https://leetcode.com/problems/peeking-iterator/) | [Link](./lib/medium/284_peeking_iterator.rb) | [Link](./test/medium/test_284_peeking_iterator.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index c08595e8..c8ae1f65 100644 --- a/leetcode-ruby.gemspec +++ b/leetcode-ruby.gemspec @@ -5,7 +5,7 @@ require 'English' ::Gem::Specification.new do |s| s.required_ruby_version = '>= 3.0' s.name = 'leetcode-ruby' - s.version = '6.7.8' + s.version = '6.7.9' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/284_peeking_iterator.rb b/lib/medium/284_peeking_iterator.rb new file mode 100644 index 00000000..09429f02 --- /dev/null +++ b/lib/medium/284_peeking_iterator.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/peeking-iterator/ +class PeekingIterator + # @param {Iterator} iter + def initialize(iter) + @iterator = iter + @next = @iterator.next + end + + # Returns true if the iteration has more elements. + # @return {Integer} + def has_next = !@next.nil? + + # Returns the next element in the iteration. + # @return {Integer} + def next + tmp = @next + @next = @iterator.has_next ? @iterator.next : nil + + tmp + end + + # Returns the next element in the iteration without advancing the iterator. + # @return {Integer} + def peek = @next +end + +# Iterator +class Iterator + # @param {Array} v + def initialize(v) + @arr = v + @curr = 0 + end + + # @return {Boolean} + def has_next = @arr.size > @curr + + # @return {Integer} + def next + tmp = @arr[@curr] + @curr += 1 + + tmp + end +end diff --git a/test/medium/test_284_peeking_iterator.rb b/test/medium/test_284_peeking_iterator.rb new file mode 100644 index 00000000..826d8b83 --- /dev/null +++ b/test/medium/test_284_peeking_iterator.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/284_peeking_iterator' +require 'minitest/autorun' + +class PeekingIteratorTest < ::Minitest::Test + def test_default_one + peeking_iterator = ::PeekingIterator.new( + ::Iterator.new([1, 2, 3]) + ) + + assert_equal(1, peeking_iterator.next) + assert_equal(2, peeking_iterator.peek) + assert_equal(2, peeking_iterator.next) + assert_equal(3, peeking_iterator.next) + + assert(!peeking_iterator.has_next) + end +end