Ruby 关于方法参数传递的问题,如何修改传过来得值

759803573 · 2015年04月01日 · 最后由 759803573 回复于 2015年04月01日 · 2592 次阅读

这是我再 leetcode 上遇见的一道题: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

我是这样完成的

# @param {Integer[]} nums
# @param {Integer} k
# @return {void} Do not return anything, modify nums in-place instead.
def rotate(nums, k)
   k %=nums.length    
  if k!= 0   
    t = nums[k..(nums.length-1).to_i]
    f = nums[0..(k-1).to_i]
    nums = t + f
  end  
end

问题是 nums 的值只在函数内改变了

k 允许大于 n 吗?可以用 Ruby 内建方法吗?

def rotate(nums, k)
  head = nums.shift(k%m)
  nums.push(*head)
end

#1 楼 @serco 可以用内建方法 k 可以大于 nums.length 错误应该是因为 我给 nums 重新赋值了

nums.instance_exec(k) do
  k %=self.length
  if k!= 0
    t = self[k..(self.length-1).to_i]
    f = self[0..(k-1).to_i]
    nums = t + f
  end  
end

作用域问题

#3 楼 @jyootai 貌似还是不行额......

def xxx nums,k
  nums.instance_exec(k) do
   k %=self.length
   if k!= 0
     t = self[k..(self.length-1).to_i]
     f = self[0..(k-1).to_i]
     nums = t + f
   end
  end
end

nums = [1,2]
xxx nums,1
p nums

.......................Sub_table/sources/a.rb" [1, 2]

Process finished with exit code 0

这样使用就是说你不需要在定义方法了,直接使用:

nums = [1,2]
k = 1
nums.instance_exec(k) do
  k %=self.length
  if k!= 0
    t = self[k..(self.length-1).to_i]
    f = self[0..(k-1).to_i]
    nums = t + f
  end  
end
p nums 

#4 楼 @759803573 如果你真要调用方法的话,最简单的方法就是: nums = rotate(nums, k)

解决了 只要不对 nums 重新赋值就好了

# @param {Integer[]} nums
# @param {Integer} k
# @return {void} Do not return anything, modify nums in-place instead.
def rotate(nums, k)
  if k!=0
    k %=nums.length
    t = nums.pop k
    t.reverse.each do |value|
      nums.insert 0,value
    end
  end   
  return
end

#6 楼 @jyootai 谢谢你啊,我这是 leetcode 上做的算法题

#1 楼 @serco 谢谢你,已经解决了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号