腾讯面试题:0到9999这1万个数中有多少个数字7

  •   
  • 3571
  • WEB周边
  • 34
  • super_dodo
  • 2017/03/15

题目:
0 到 9999 这 1 万个数中有多少个数字 7 ?(请不要理解为多少个数包含 7)

思路&答案
总共有四位数,每位数的可能分别有10种(0~9)。
每一个位,都会出现0-9的交替,实际上在出现7这个角度,各个位是一样的。

现在假设个位固定为7,那么其他的位数的变化数量是10 10 10 = 1000种。
就是说数字7在个位出现的次数为1000。

以此类推,数字7在十位、百位、千位出现的次数也是1000。

故答案为 4 * 1000 = 4000

how_many_7

那其实1-9的数目都是一致的都是 4000个,比较变态是0的个数。。因为正常的逻辑里面 不可能写0001 0002 0010 这样。所以关于有多少个0的计算。欢迎大家拍砖。dodo先用最笨的枚举法把0的个数正确的计算出来。

//用很笨的枚举法来做
$str = '';
for($i=0;$i<10000;$i++){
	$str .= $i;
}
//echo $str.'<hr>';			//输出所有字符串

echo substr_count($str,'7');
//结果为:4000

echo substr_count($str,'1');
//结果为:4000

echo substr_count($str,'9');
//结果为:4000

echo substr_count($str,'0');
//结果为:2890

引申发散一下,如果是有多少个数字里面含有7呢。求拍砖指引。。

//包含某个数字的数目 777只是算包含1个包含7的数字
$num_7 = 0;
$num_1 = 0;
$num_9 = 0;
$num_0 = 0;
for($i=0;$i<10000;$i++){
	if(strstr($i,'7')){ $num_7 += 1; }
	if(strstr($i,'1')){ $num_1 += 1; }
	if(strstr($i,'9')){ $num_9 += 1; }
	if(strstr($i,0) == true){ $num_0 += 1; }
}
//echo $str.'<hr>';			//输出所有字符串

echo $num_7.'<hr>';
//结果为:3439

echo $num_1.'<hr>';
//结果为:3439

echo $num_9.'<hr>';
//结果为:3439

echo $num_0.'<hr>';
//结果为:1800 此处需要增加1 因为 strstr(0,0)是0 所以需要加上1 针对0这个数字
//最终结果为 1801

温馨提示:附上一段来自【昆明小泽】的js实现的代码

<script>
        var n = 10000;
        var j = 0;
        var d = 0;
        for(i=1;i<n;i++){
            if(i.toString().indexOf("7") != -1){
                 j++;
            }
            if(i.toString().match(/7/g)){
                for(var b =0; b< i.toString().match(/7/g).length;b++){
                 d++;
                }
            }
        }
        console.log("如果是包含的话是"+d+"个");
        console.log("如果是数字的话是"+j+"个");
    </script>

春水初生,春林初盛,春风十里,不如你。——冯唐《三十六大》