diff --git a/README.md b/README.md index 52c341aa..c1b30f57 100644 --- a/README.md +++ b/README.md @@ -488,3 +488,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/). | 56. Merge Intervals | [Link](https://leetcode.com/problems/merge-intervals/) | [Link](./lib/medium/56_merge_intervals.rb) | | 57. Insert Interval | [Link](https://leetcode.com/problems/insert-interval/) | [Link](./lib/medium/57_insert_interval.rb) | | 59. Spiral Matrix II | [Link](https://leetcode.com/problems/spiral-matrix-ii/) | [Link](./lib/medium/59_spiral_matrix_ii.rb) | +| 61. Rotate ListII | [Link](https://leetcode.com/problems/rotate-list/) | [Link](./lib/medium/61_rotate_list.rb) | diff --git a/leetcode-ruby.gemspec b/leetcode-ruby.gemspec index edfc242a..282232ae 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.2.2' + s.version = '6.2.3' s.license = 'MIT' s.files = ::Dir['lib/**/*.rb'] + %w[bin/leetcode-ruby README.md LICENSE] s.executable = 'leetcode-ruby' diff --git a/lib/common/linked_list.rb b/lib/common/linked_list.rb index 9a1ebaf5..8340bbed 100644 --- a/lib/common/linked_list.rb +++ b/lib/common/linked_list.rb @@ -21,6 +21,7 @@ def self.from_array(values) list.next = ::ListNode.new(value) list = list.next end + head end diff --git a/lib/medium/61_rotate_list.rb b/lib/medium/61_rotate_list.rb new file mode 100644 index 00000000..1768bc95 --- /dev/null +++ b/lib/medium/61_rotate_list.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +require_relative '../common/linked_list' + +# https://leetcode.com/problems/rotate-list/ +# @param {ListNode} head +# @param {Integer} k +# @return {ListNode} +def rotate_right(head, k) + size = 0 + p = head + + until p.nil? + p = p.next + size += 1 + end + + return head if size < 2 || size == k + + places = k > size ? k % size : k + + return head if places.zero? + + div = head + (0...(size - places - 1)).each { |_| div = div&.next } + + old_head = head + head = div&.next + div&.next = nil + last = head + + last = last&.next until last&.next.nil? + last&.next = old_head + + head +end diff --git a/test/easy/test_100_same_tree.rb b/test/easy/test_100_same_tree.rb index d20cfa44..3b93d31d 100644 --- a/test/easy/test_100_same_tree.rb +++ b/test/easy/test_100_same_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/100_same_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/100_same_tree' require 'minitest/autorun' class SameTreeTest < ::Minitest::Test diff --git a/test/easy/test_101_symmetric_tree.rb b/test/easy/test_101_symmetric_tree.rb index 4c236748..c4e4d7fc 100644 --- a/test/easy/test_101_symmetric_tree.rb +++ b/test/easy/test_101_symmetric_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/101_symmetric_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/101_symmetric_tree' require 'minitest/autorun' class SymmetricTreeTest < ::Minitest::Test diff --git a/test/easy/test_104_maximum_depth_of_binary_tree.rb b/test/easy/test_104_maximum_depth_of_binary_tree.rb index 9f6ebe21..799491fa 100644 --- a/test/easy/test_104_maximum_depth_of_binary_tree.rb +++ b/test/easy/test_104_maximum_depth_of_binary_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/104_maximum_depth_of_binary_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/104_maximum_depth_of_binary_tree' require 'minitest/autorun' class MaximumDepthOfBinaryTreeTest < ::Minitest::Test diff --git a/test/easy/test_108_convert_sorted_array_to_binary_search_tree.rb b/test/easy/test_108_convert_sorted_array_to_binary_search_tree.rb index 184ee3f4..ba0102a6 100644 --- a/test/easy/test_108_convert_sorted_array_to_binary_search_tree.rb +++ b/test/easy/test_108_convert_sorted_array_to_binary_search_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/108_convert_sorted_array_to_binary_search_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/108_convert_sorted_array_to_binary_search_tree' require 'minitest/autorun' class ConvertSortedArrayToBinarySearchTreeTest < ::Minitest::Test diff --git a/test/easy/test_110_balanced_binary_tree.rb b/test/easy/test_110_balanced_binary_tree.rb index f63fa827..45a597d5 100644 --- a/test/easy/test_110_balanced_binary_tree.rb +++ b/test/easy/test_110_balanced_binary_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/110_balanced_binary_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/110_balanced_binary_tree' require 'minitest/autorun' class BalancedBinaryTreeTest < ::Minitest::Test diff --git a/test/easy/test_111_minimum_depth_of_binary_tree.rb b/test/easy/test_111_minimum_depth_of_binary_tree.rb index 46486911..be859364 100644 --- a/test/easy/test_111_minimum_depth_of_binary_tree.rb +++ b/test/easy/test_111_minimum_depth_of_binary_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/111_minimum_depth_of_binary_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/111_minimum_depth_of_binary_tree' require 'minitest/autorun' class MinimumDepthOfBinaryTreeTest < ::Minitest::Test diff --git a/test/easy/test_112_path_sum.rb b/test/easy/test_112_path_sum.rb index f6a9e27f..8add1539 100644 --- a/test/easy/test_112_path_sum.rb +++ b/test/easy/test_112_path_sum.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/112_path_sum' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/112_path_sum' require 'minitest/autorun' class PathSumTest < ::Minitest::Test diff --git a/test/easy/test_141_linked_list_cycle.rb b/test/easy/test_141_linked_list_cycle.rb index 04560b88..31bf607a 100644 --- a/test/easy/test_141_linked_list_cycle.rb +++ b/test/easy/test_141_linked_list_cycle.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/141_linked_list_cycle' require_relative '../../lib/common/linked_list' +require_relative '../../lib/easy/141_linked_list_cycle' require 'minitest/autorun' class LinkedListCycleTest < ::Minitest::Test diff --git a/test/easy/test_144_binary_tree_preorder_traversal.rb b/test/easy/test_144_binary_tree_preorder_traversal.rb index a4b94548..3c825f68 100644 --- a/test/easy/test_144_binary_tree_preorder_traversal.rb +++ b/test/easy/test_144_binary_tree_preorder_traversal.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/144_binary_tree_preorder_traversal' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/144_binary_tree_preorder_traversal' require 'minitest/autorun' class BinaryTreePreorderTraversalTest < ::Minitest::Test diff --git a/test/easy/test_145_binary_tree_postorder_traversal.rb b/test/easy/test_145_binary_tree_postorder_traversal.rb index 75b8f61a..d53b2862 100644 --- a/test/easy/test_145_binary_tree_postorder_traversal.rb +++ b/test/easy/test_145_binary_tree_postorder_traversal.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/145_binary_tree_postorder_traversal' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/145_binary_tree_postorder_traversal' require 'minitest/autorun' class BinaryTreePostorderTraversalTest < ::Minitest::Test diff --git a/test/easy/test_160_intersection_of_two_linked_lists.rb b/test/easy/test_160_intersection_of_two_linked_lists.rb index 50e9ac1c..7db7d5f3 100644 --- a/test/easy/test_160_intersection_of_two_linked_lists.rb +++ b/test/easy/test_160_intersection_of_two_linked_lists.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/160_intersection_of_two_linked_lists' require_relative '../../lib/common/linked_list' +require_relative '../../lib/easy/160_intersection_of_two_linked_lists' require 'minitest/autorun' class IntersectionOfTwoLinkedListsTest < ::Minitest::Test diff --git a/test/easy/test_203_remove_linked_list_elements.rb b/test/easy/test_203_remove_linked_list_elements.rb index fa4cad18..2eaebd62 100644 --- a/test/easy/test_203_remove_linked_list_elements.rb +++ b/test/easy/test_203_remove_linked_list_elements.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/203_remove_linked_list_elements' require_relative '../../lib/common/linked_list' +require_relative '../../lib/easy/203_remove_linked_list_elements' require 'minitest/autorun' class RemoveLinkedListElementsTest < ::Minitest::Test diff --git a/test/easy/test_2236_root_equals_sum_of_children.rb b/test/easy/test_2236_root_equals_sum_of_children.rb index 366db787..1400d54a 100644 --- a/test/easy/test_2236_root_equals_sum_of_children.rb +++ b/test/easy/test_2236_root_equals_sum_of_children.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/2236_root_equals_sum_of_children' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/2236_root_equals_sum_of_children' require 'minitest/autorun' class RootEqualsSumOfChildrenTest < ::Minitest::Test diff --git a/test/easy/test_2239_find_closest_number_to_zero.rb b/test/easy/test_2239_find_closest_number_to_zero.rb index 92aa9c8f..8ddf5358 100644 --- a/test/easy/test_2239_find_closest_number_to_zero.rb +++ b/test/easy/test_2239_find_closest_number_to_zero.rb @@ -2,7 +2,6 @@ require_relative '../test_helper' require_relative '../../lib/easy/2239_find_closest_number_to_zero' -require_relative '../../lib/common/binary_tree' require 'minitest/autorun' class FindClosestNumberToZeroTest < ::Minitest::Test diff --git a/test/easy/test_2331_evaluate_boolean_binary_tree.rb b/test/easy/test_2331_evaluate_boolean_binary_tree.rb index e4135bfc..69425a17 100644 --- a/test/easy/test_2331_evaluate_boolean_binary_tree.rb +++ b/test/easy/test_2331_evaluate_boolean_binary_tree.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/2331_evaluate_boolean_binary_tree' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/2331_evaluate_boolean_binary_tree' require 'minitest/autorun' class EvaluateBooleanBinaryTreeTest < ::Minitest::Test diff --git a/test/easy/test_83_remove_duplicates_from_sorted_list.rb b/test/easy/test_83_remove_duplicates_from_sorted_list.rb index 0f89cfa5..ba9ce423 100644 --- a/test/easy/test_83_remove_duplicates_from_sorted_list.rb +++ b/test/easy/test_83_remove_duplicates_from_sorted_list.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/83_remove_duplicates_from_sorted_list' require_relative '../../lib/common/linked_list' +require_relative '../../lib/easy/83_remove_duplicates_from_sorted_list' require 'minitest/autorun' class RemoveDuplicatesFromSortedListTest < ::Minitest::Test diff --git a/test/easy/test_94_binary_tree_inorder_traversal.rb b/test/easy/test_94_binary_tree_inorder_traversal.rb index aec1e155..87f6efd2 100644 --- a/test/easy/test_94_binary_tree_inorder_traversal.rb +++ b/test/easy/test_94_binary_tree_inorder_traversal.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/easy/94_binary_tree_inorder_traversal' require_relative '../../lib/common/binary_tree' +require_relative '../../lib/easy/94_binary_tree_inorder_traversal' require 'minitest/autorun' class BinaryTreeInorderTraversalTest < ::Minitest::Test diff --git a/test/medium/test_19_remove_nth_node_from_end_of_list.rb b/test/medium/test_19_remove_nth_node_from_end_of_list.rb index f3391168..c1119345 100644 --- a/test/medium/test_19_remove_nth_node_from_end_of_list.rb +++ b/test/medium/test_19_remove_nth_node_from_end_of_list.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/medium/19_remove_nth_node_from_end_of_list' require_relative '../../lib/common/linked_list' +require_relative '../../lib/medium/19_remove_nth_node_from_end_of_list' require 'minitest/autorun' class RemoveNthNodeFromEndOfListTest < ::Minitest::Test diff --git a/test/medium/test_24_swap_nodes_in_pairs.rb b/test/medium/test_24_swap_nodes_in_pairs.rb index b7cf16c7..5e7d31c4 100644 --- a/test/medium/test_24_swap_nodes_in_pairs.rb +++ b/test/medium/test_24_swap_nodes_in_pairs.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/medium/24_swap_nodes_in_pairs' require_relative '../../lib/common/linked_list' +require_relative '../../lib/medium/24_swap_nodes_in_pairs' require 'minitest/autorun' class SwapNodesInPairsTest < ::Minitest::Test diff --git a/test/medium/test_2_add_two_numbers.rb b/test/medium/test_2_add_two_numbers.rb index 22ffe836..d9e2b342 100644 --- a/test/medium/test_2_add_two_numbers.rb +++ b/test/medium/test_2_add_two_numbers.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true require_relative '../test_helper' -require_relative '../../lib/medium/2_add_two_numbers' require_relative '../../lib/common/linked_list' +require_relative '../../lib/medium/2_add_two_numbers' require 'minitest/autorun' class AddTwoNumbersTest < ::Minitest::Test diff --git a/test/medium/test_61_rotate_list.rb b/test/medium/test_61_rotate_list.rb new file mode 100644 index 00000000..e4f14c41 --- /dev/null +++ b/test/medium/test_61_rotate_list.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +require_relative '../test_helper' +require_relative '../../lib/common/linked_list' +require_relative '../../lib/medium/61_rotate_list' +require 'minitest/autorun' + +class RotateListTest < ::Minitest::Test + def test_default + assert( + ::ListNode.are_equals( + ::ListNode.from_array([4, 5, 1, 2, 3]), + rotate_right(::ListNode.from_array([1, 2, 3, 4, 5]), 2) + ) + ) + assert( + ::ListNode.are_equals( + ::ListNode.from_array([2, 0, 1]), + rotate_right(::ListNode.from_array([0, 1, 2]), 4) + ) + ) + end +end