# @param {Integer[]} nums # @param {Integer} k # @return {Void} Do not return anything, modify nums in-place instead. def rotate(nums, k) def reverse(nums, from, to) while from < to do nums[from], nums[to] = nums[to], nums[from] from += 1 to -= 1 end end k = k % nums.size reverse(nums, 0, nums.size - 1) reverse(nums, 0, k - 1) reverse(nums, k, nums.size - 1) end RSpec.describe "rotate" do it "nums = [1,2,3,4,5,6,7], k = 0" do nums = [1,2,3,4,5,6,7] k = 0 rotate(nums, k) expect(nums).to eq([1,2,3,4,5,6,7]) end it "nums = [1,2,3,4,5,6,7], k = 1" do nums = [1,2,3,4,5,6,7] k = 1 rotate(nums, k) expect(nums).to eq([7,1,2,3,4,5,6]) end it "nums = [1,2,3,4,5,6,7], k = 2" do nums = [1,2,3,4,5,6,7] k = 2 rotate(nums, k) expect(nums).to eq([6,7,1,2,3,4,5]) end it "nums = [1,2,3,4,5,6,7], k = 3" do nums = [1,2,3,4,5,6,7] k = 3 rotate(nums, k) expect(nums).to eq([5,6,7,1,2,3,4]) end it "nums = [-1,-100,3,99], k = 1" do nums = [-1,-100,3,99] k = 1 rotate(nums, k) expect(nums).to eq([99,-1,-100,3]) end it "nums = [-1,-100,3,99], k = 2" do nums = [-1,-100,3,99] k = 2 rotate(nums, k) expect(nums).to eq([3,99,-1,-100]) end end