论坛首页 招聘求职论坛

一道关于Ruby的面试题

浏览 21917 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-02-11   最后修改:2012-02-13
前几天面试了一家用Ruby on Rails开发网站的公司,前面接待后让填了个表和几道面试题,一共大概有6、7道题,都是算法与逻辑方面的,其中有一道大概是这样的:统计出从0-n之间1的个数,如n=13,f(0..13)=>6,0到13有6个数带有1,要求不能用字符串方式计算,只能用数学方式。我想了很久也没想出如何计算。
   发表时间:2012-02-12  
def f(r)
   n = 0
   r.to_a.each{|x|

      #十位有1
      if x / 10 == 1
         n +=1 
         #p x
      end

      #个位有1
      if x%10 ==1
         n += 1
         #p x
      end
   }
   n
end

p f(0..13)

0 请登录后投票
   发表时间:2012-02-12  
谢谢@sevk,应该大概的逻辑就是这样,统计出每位1的个数,只是很难明白出这题的本意,另外题目中指出不能用字符串方式,也就是不清楚是否可以计算数字的位数,从程序上就很不灵活了。像百位、千位、万位这样的数字,每位都要有个判断,很不敏捷。

不过就面试题的解法,这是个不错的答案,再次感谢@sevk!
0 请登录后投票
   发表时间:2012-02-12  
def f(n)
   cnt=0
   
   (1..n).to_a.each do |r|
 
      i = 1
      while i
         break if r/(10**i) < 1
         i += 1
       end 
      
      tmp = r 
      while i>0
        cnt += 1 if tmp/(10**i) == 1
        tmp = tmp%(10**i)
        cnt += 1 if tmp == 1
        i -= 1
      end
   end
   puts cnt
end

f(13)
0 请登录后投票
   发表时间:2012-02-13   最后修改:2012-02-13
def f(range)
  range.inject do |sum, n|
    while n > 0
      sum += 1 if n % 10 == 1
      n = n / 10
    end
    sum
  end
end
0 请登录后投票
   发表时间:2012-02-13  
你们的方法都不具有普遍性,如果求(444..2345345)还能用吗?
0 请登录后投票
   发表时间:2012-02-13  
fan2012 写道
你们的方法都不具有普遍性,如果求(444..2345345)还能用吗?

用我的算是 2478924

性能有点慢,哈哈
0 请登录后投票
   发表时间:2012-02-13   最后修改:2012-02-13
应该为
def f(range=0)
  (0..range).to_a.inject do |sum, n|
    while n > 0
      sum += 1 if n % 10 == 1
      n = n / 10
    end
    sum
  end
end
0 请登录后投票
   发表时间:2012-02-13  
lanqishao 写道
应该为
def f(range=0)
  (0..range).to_a.inject do |sum, n|
    while n > 0
      sum += 1 if n % 10 == 1
      n = n / 10
    end
    sum
  end
end

顶楼要求输入 f(0..13)=>6 阿

Range 可以直接 inject,包含了 Enumerable。
0 请登录后投票
   发表时间:2012-02-13  
是可以的,我没理解清楚。 不过执行速度很慢
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics