From 45031c8ef84061f34e98241f750474c7d505a837 Mon Sep 17 00:00:00 2001 From: fartem Date: Fri, 11 Oct 2024 09:02:19 +0300 Subject: [PATCH] 2024-10-11 v. 6.8.0: added "287. Find the Duplicate Number" --- README.md | 1 + leetcode-ruby.gemspec | 2 +- lib/medium/287_find_the_duplicate_number.rb | 25 +++++++++++++++++++ .../test_287_find_the_duplicate_number.rb | 13 ++++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lib/medium/287_find_the_duplicate_number.rb create mode 100644 test/medium/test_287_find_the_duplicate_number.rb diff --git a/README.md b/README.md index d79eea09..a5136f65 100644 --- a/README.md +++ b/README.md @@ -545,3 +545,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 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) | +| 287. Find the Duplicate Number | [Link](https://leetcode.com/problems/find-the-duplicate-number/) | [Link](./lib/medium/287_find_the_duplicate_number.rb) | [Link](./test/medium/test_287_find_the_duplicate_number.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index c8ae1f65..cf3d931c 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.9' + s.version = '6.8.0' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[README.md] s.executable = 'leetcode-ruby' diff --git a/lib/medium/287_find_the_duplicate_number.rb b/lib/medium/287_find_the_duplicate_number.rb new file mode 100644 index 00000000..d5d22fea --- /dev/null +++ b/lib/medium/287_find_the_duplicate_number.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +# https://leetcode.com/problems/find-the-duplicate-number/ +# @param {Integer[]} nums +# @return {Integer} +def find_duplicate(nums) + tortoise = nums.first + hare = nums.first + + loop do + tortoise = nums[tortoise] + hare = nums[nums[hare]] + + break if tortoise == hare + end + + tortoise = nums.first + + until tortoise == hare + tortoise = nums[tortoise] + hare = nums[hare] + end + + hare +end diff --git a/test/medium/test_287_find_the_duplicate_number.rb b/test/medium/test_287_find_the_duplicate_number.rb new file mode 100644 index 00000000..5fbd9909 --- /dev/null +++ b/test/medium/test_287_find_the_duplicate_number.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/medium/287_find_the_duplicate_number' +require 'minitest/autorun' + +class FindTheDuplicateNumberTest < ::Minitest::Test + def test_default_one = assert_equal(2, find_duplicate([1, 3, 4, 2, 2])) + + def test_default_two = assert_equal(3, find_duplicate([3, 1, 3, 4, 2])) + + def test_default_three = assert_equal(3, find_duplicate([3, 3, 3, 3, 3])) +end