论坛首页 招聘求职论坛

一道关于Ruby的面试题

浏览 21918 次
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-10  
int[] array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int count = 0;
for(int i = 0; i < array.length; i ++)
{
    int value = array[i];
    while(value > 0)
    {
        count += value % 10 == 1? 1 : 0;
        value = value / 10;
    }
}
System.out.println(count);
0 请登录后投票
   发表时间:2012-05-28   最后修改:2012-05-28

 

module NumberChecker
    module Cache
        def __cached_result_get(num, key)
            __cache(key)[num]
        end
        
        def __cached_result_set(num, key,result)
            __cache(key)[num] = result
            result
        end
        
        def __cache(key)
            @__cache ||= {}
            @__cache[key] ||= {}
        end
    end
    
    def self.included(klass)
        klass.extend(NumberChecker::Cache)
    end
    
    def has_number?(num)
        return num == self if self < 10
        before_num = self/10
        last_num = self - (before_num*10)
        last_num == num ? true : before_num.has_number?(num)
    end
    
    def number_size(num)
        self.class.__cached_result_get(self, num) || self.class.__cached_result_set(self, num, _number_size(num))
    end
    
    def _number_size(num)
        return (self == num ? 1 : 0) if self < 10 
        before_num = self/10
        last_num = self - (before_num*10)
        before_num.number_size(num) + (last_num == num ? 1 : 0)
    end
end

Fixnum.send(:include, NumberChecker)
require 'benchmark'
end_number = 1000000
Benchmark.bmbm do |x|
x.report{ puts (0..end_number).inject(0) {|result, n| result + n.number_size(1)} }
end
 
 写道

Rehearsal ------------------------------------

 600001

  7.580000   0.050000   7.630000 (  7.680408)

--------------------------- total: 7.630000sec

 

       user     system      total        real

 600001

  4.010000   0.010000   4.020000 (  4.038076) 
0 请登录后投票
   发表时间:2012-06-05   最后修改:2012-06-06
简单思路:
设:
n为k位数 ( k = log10(n)+1 )
f(n)为0到n中含1的个数 (也就是题目所要求的解)
f1(n)为n的最高位含1的个数
f9(k)为0到k位数最大值(k个9)中含1的个数。
tail(n)为n去掉最高位后的尾数 ( tail(n) = n - 10^(log10(n)) )
显然有:f(n)=f9(k-1)+ f1(n) + f(tail(n))

其中:
f9(k) = 10 * f9(k-1) + 10^(k-1)
f9(0) = 0

f1(n) = (n的最高位为1)? tail(n)+1 : 10^(k-1)

另,当k=1 (0<=n<10)时,f(n)= (n > 0) ? 1 : 0
按上面的函数递归即可。

例如:
f(13)
= 9中含1的个数 + 13的最高位含1的个数 + 3中含1的个数
= (10*0+1) + (tail(13) + 1) + f(3)
= 1 + 4 + 1
= 6

注:
9中含1的个数 = f9(1) = 10*f9(0) + 10^0 = 0 + 1 = 1
13的最高位(十位)上出现1的个数为3+1=4个(10到13)

----------------------
f(113)
= 99中含1的个数 + 113的最高位含1的个数 + 13中含1的个数
= 20 + 14 + 6
= 40

注:
99中含1的个数 = f9(2) = 10*f9(1) + 10^1 = 20 (10至19中十位上的10个1加上1、11、21、31、41直到91中个位上的10个1)

-----------------------
f(213)
= 99中含1的个数 + 213的最高位含1的个数 + 13中含1的个数
= 20 + 100 + 6
= 126

注:
213的最高位(百位)含1的个数为10^2 = 100个(100到199)

0 请登录后投票
   发表时间:2012-06-06   最后修改:2012-06-06
kidneyball 写道
简单思路:
设:
n为k位数 ( k = log10(n)+1 )
f(n)为0到n中含1的个数 (也就是题目所要求的解)
f1(n)为n的最高位含1的个数
f9(k)为0到k位数最大值(k个9)中含1的个数。
tail(n)为n去掉最高位后的尾数 ( tail(n) = n - 10^(log10(n)) )
显然有:f(n)=f9(k-1)+ f1(n) + f(tail(n))

其中:
f9(k) = 10 * f9(k-1) + 10^(k-1)
f9(0) = 0

f1(n) = (n的最高位为1)? tail(n)+1 : 10^(k-1)

另,当k=1 (0<=n<10)时,f(n)= (n > 0) ? 1 : 0
按上面的函数递归即可。

例如:
f(13)
= 9中含1的个数 + 13的最高位含1的个数 + 3中含1的个数
= (10*0+1) + (tail(13) + 1) + f(3)
= 1 + 4 + 1
= 6

注:
9中含1的个数 = f9(1) = 10*f9(0) + 10^0 = 0 + 1 = 1
13的最高位(十位)上出现1的个数为3+1=4个(10到13)

----------------------
f(113)
= 99中含1的个数 + 113的最高位含1的个数 + 13中含1的个数
= 20 + 14 + 6
= 40

注:
99中含1的个数 = f9(2) = 10*f9(1) + 10^1 = 20 (10至19中十位上的10个1加上1、11、21、31、41直到91中个位上的10个1)

-----------------------
f(213)
= 99中含1的个数 + 213的最高位含1的个数 + 13中含1的个数
= 20 + 100 + 6
= 126

注:
213的最高位(百位)含1的个数为10^2 = 100个(100到199)



漏算了一部分,更正一下:

再设:fn(n) = n的最高位上的数字 = n / 10^(log10(n))
则:
f(n)
= f9(k-1)+ f1(n) + (fn(n)-1)*f9(k-1) + f(tail(n))
= f1(n) + fn(n)*f9(k-1) + f(tail(n))


例如:
213中含1数
f(213) = 0-99中含1数 + 百位上含1数 + 100-199之间除百位上的含1数(也就是 99中的含1数) + 13中的含1数
= 20 + 100 + 20 + 6
= 146

313中含1数
= 99中含1数 + 百位上含1数 + 100到299之间除百位上的的含1数(也就是 99中含1数*2) + 13中的含1数
= 20 + 100 + 40 + 6
= 166
0 请登录后投票
   发表时间:2012-06-06   最后修改:2012-06-06
再提供一种非递归的更简单的思路:
设k为n任意一位数(k=1,2,3,4。。。)
a为n中第k位上的数字
head为n中第k位前面的数字(当k为最高位时,head为0)
tail为n中第k位后面的数字(当k为1时,tail为0)
即 n = head *(10^k) + a*(10^(k-1)) + tail

那么,对于任意k,在k位上出现1的次数fn(k)为
fn(k) = 0到head*(10^k)中k位上出现1的次数 + head*(10^k)到n之间k位上出现1的次数

“0到head*(10^k)中k位上出现1的次数”很容易算出,是head*(10^(k-1))。(head每加1,则n中会出现一段k位为1的连续区间,该区间所包含数字的个数为10^(k-1) )

而"head*(10^k)到n之间k位上出现1的次数"则根据a的不同而不同:
当a=0时,为0
当a=1时,为tail+1
当a>1时,为10^(k-1)

把k从1循环到n的最高位,累加fn(k)的结果即得最终解。

=======================
例如
13:
fn(1) = 1*10^0 + 10^0 = 2
fn(2) = 0*10^1 + 3 + 1 = 4
最终解为6

-------
113:
fn(1) = 11*10^0 + 10^0 = 12
fn(2) = 1*10^1 + 3 + 1 = 14
fn(3) = 0*10^2 + 13 + 1 = 14
最终解为:40

-------
213:
fn(1) = 21*10^0 + 10^0 = 22
fn(2) = 2*10^1 + 3 + 1 = 24
fn(3) = 0*10^2 + 10^2 = 100
最终解为:146

------
313:
fn(1) = 31*10^0 + 10^0 = 32
fn(2) = 3*10^1 + 3 + 1 = 34
fn(3) = 0*10^2 + 10^2 = 100
最终解为:166
0 请登录后投票
   发表时间:2012-06-20  
cttnbcj 写道
小的献丑了
组合问题,就是有个n数,X位,当他全部为空小于n时候的,1放置的全部组合方法


假如是n<100
就是有当他是两位  () ()
      情况一:  第一空格可以放1 然后第二空格放0-9
      情况二:  第一空格可以放0-9(去1) 然后第二空格放1
就可推出任何数的组合的公式:其实上面0到9数字的个数,是平均分布的。


记得几天前有个题目也是算  1.......n  的所有数,每个位分开后的数值。
一个求值一个是计数,类似的题目。

n=13 就更加简单,脑算就行了  1()  ()有0-3可能  0()  有一种可能      一共6种

我觉得这个不错,抽象出来了
0 请登录后投票
   发表时间:2012-06-26  
归根结底是考数学嘛
0 请登录后投票
   发表时间:2012-06-26  
object Mianshi extends App {
  //获得十进制数组方法
  def getScienceList(n: Int): List[Int] = {
    def helper(a: Int, xs: List[Int]): List[Int] = a match {
      case n if n / 10 != 0 => helper(a % 10, n / 10 :: xs)
      case n if n % 10 != 0 => helper(0, n % 10 :: xs)
      case _                => xs
    }
    helper(n, Nil).reverse
  }
  //获得一个数1的个数的数量
  def num1Count(n: Int): Int =
    getScienceList(n) filter ((_:Int)==1) size

  //获得0到Range的1的个数
  def range1Count(range: Int): Int = {
    var count = 0
    for (i <- 0 to range) {
      count += num1Count(i)
    }
    count
  }

  println(range1Count(13))
}
0 请登录后投票
   发表时间:2012-06-26  
上面那个是scala代码,list的reverse是多余的.手贱多写9个字母
0 请登录后投票
   发表时间:2012-08-10  
来个循环+递归的.本机没有IDE,盲写的没调试,有bug请见谅。


public class OneCounter {

 private int n ;
 private int result;

 public OneCounter(int n){
  this.n = n;
  this.result = 0;
  count();
 }

 private void count(){
  for(int i=0;i<=n;i++){
   count(i,10);
  }
 }

 private void count(int m,int seed){
  if(m > seed/10){
   return;
  }

  if(m % seed / (seed / 10) == 1){
   this.result ++;
  }

  count(m,seed*10);
 }

 public void printResult(){
  System.out.println("input ["+this.n+"] , the result is ["+this.result+"] .");
 }

}




invoke:
new OneCounter(13).printResult();//the result is 6.
0 请登录后投票
论坛首页 招聘求职版

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