锁定老帖子 主题:一道关于Ruby的面试题
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-02-11
最后修改:2012-02-13
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |
发表时间:2012-02-12
谢谢@sevk,应该大概的逻辑就是这样,统计出每位1的个数,只是很难明白出这题的本意,另外题目中指出不能用字符串方式,也就是不清楚是否可以计算数字的位数,从程序上就很不灵活了。像百位、千位、万位这样的数字,每位都要有个判断,很不敏捷。
不过就面试题的解法,这是个不错的答案,再次感谢@sevk! |
|
返回顶楼 | |
发表时间: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) |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2012-02-13
你们的方法都不具有普遍性,如果求(444..2345345)还能用吗?
|
|
返回顶楼 | |
发表时间:2012-02-13
fan2012 写道 你们的方法都不具有普遍性,如果求(444..2345345)还能用吗?
用我的算是 2478924 性能有点慢,哈哈 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2012-02-13
是可以的,我没理解清楚。 不过执行速度很慢
|
|
返回顶楼 | |