`
jgsj
  • 浏览: 962159 次
文章分类
社区版块
存档分类
最新评论

面试题:计算0到n的数中有多少个2

 
阅读更多

例如给出n=100,那么就是计算0到100这么多个数中有多少个2.

首先要搞清楚2是怎么来的(这话怎么听起来不对劲?):

有2个来源:

1 个位来源:12,32,42,82,92,22等,其中的22可以先计算个位的2,然后十位的2留待第二个情况处理

2 十位来源:20,21,22,23,24,25,26,27,28,29共10个


举例1000,

1 个位2出现在,2,12,22,32,42,52,62,72,82,92共10个;也出现在102,112,122,132,142,152,162,172,182,192;202,212,...992等共100个

2 十位2出现在:20,21,22,23,24,25,26,27,28,29; 120,121,122,123,124,125,126,127,128,129;,220,221,222,223,...共100个

3 还有百位的:201,202,203,204,205,206,207,208,209,210,211,212...299共一百 个。

所以总共是300个。

但是100为的情况可以当做是10位的情况考虑,需要一点窍门。分三种情况计算。


这点窍门还是直接上程序比较好学会吧,如果解说,我觉得真是太啰嗦了,好像本书作者那样,老实说我真不知道他说啥,后来是直接看他的代码看懂的。

而且本题的难点还真不在这个思路上面,还是把思想优雅地转换成为代码这一步是最难的,就跟数字发音的题目那样。

还是那句话:会思路,和把思路转换程序差不多是两种能力来的。所以某些人老是强调思路是最重要的,但是这句话最多对了一半,因为那得看什么题目。

下面给出暴力法,和上面例子那么计算的方法:

//暴力法
int numOf2s(int i)
{
	int count = 0;
	while (i>0)
	{
		if (i%10 == 2) count++;
		i /= 10;
	}
	return count;
}
int numOf2sInRange(int n)
{
	int count = 0;
	for (int i = 2; i <= n; i++)
	{
		count += numOf2s(i);
	}
	return count;
}

//分块计算法
int count2sInRangeAtDigit(int num, int d)
{
	int powOf10 = (int) pow(10, d);
	int nextPowOf10 = 10 * powOf10;
	int right = num % powOf10;

	int roundDown = num - num % nextPowOf10;
	int roundUp = roundDown + nextPowOf10; 

	int digit = (num / powOf10) %10;

	//相当于计算个位的2,如:每十位就有一个2
	if (digit < 2)
	{
		return roundDown / 10;
	}
	//相当于计算10位的2,如:有多少个20,21,22,23的十位里面有3+1个2
	else if (digit == 2)
	{
		return roundDown / 10 + right +1;
	}
	//超过了2,那么10位的2肯定有10个,如30以下的:20,21,22,23,...,29有十个2
	else
	{
		return roundUp / 10;
	}
}

int count2sInRange(int num)
{
	int c = 0;
	ostringstream ss;
	ss<<num;
	int len = ss.str().length();
	for (int digit = 0; digit < len; digit++)
	{
		c += count2sInRangeAtDigit(num, digit);
	}
	return c;
}

int main() 
{
	int tar = 7;
	int cand[] = {1,2,3,0,3,2,0,3,1,4,5,3,2,7,5,3,0,1,2,1,3,4,6,8,1,8};
	cout<<numOf2sInRange(1000)<<endl;
	cout<<count2sInRange(1000)<<endl;

	system("pause"); 
	return 0;
}


运行结果:


上面是暴力法,下面是分块计算的方法,结果是一样的。不过好像暴力法超过9位数就无法计算出来了。

注意:计算INT_MAX的时候还有可能溢出处理方法是改成long long保存结果就可以了。很简单,本文就不给出了。O(∩_∩)O~



分享到:
评论

相关推荐

    数据挖掘分析面试题.docx

    数据挖掘分析面试题 数据挖掘分析面试题全文共16页,当前为第1页。数据挖掘分析面试题全文共16页,当前为第1页。2011Alibaba数据分析师(实习)试题解析 数据挖掘分析面试题全文共16页,当前为第1页。 数据挖掘分析...

    程序员面试金典 – 面试题 17.06. 2出现的次数(找递推规律)

    编写一个方法,计算从 0 到 n (含 n) 中数字 2 出现的次数。 示例: 输入: 25 输出: 9 解释: (2, 12, 20, 21, 22, 23, 24, 25)(注意 22 应该算作两次) 提示: n &lt;= 10^9 来源:力扣(LeetCode) 链接:...

    c++ 面试题 总结

    C++面试题 1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的...

    C/C++笔试题(附答案,华为面试题系列)

    1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为...论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播 技术的核心就是针对如何节约网络资源的前提下保证服务质量。

    20套软件测试面试题

    2.分别填入一个语句,完成下面的函数,通过递归计算数组a[100]的前n个数之和。 Int sum ( int a[],int n ) { if (n&gt;0) return___________________________; else return________________________; }

    Java经典编程题(附答案)

    题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 【程序12】 题目:...

    BAT机器学习面试1000题系列

    BAT机器学习面试1000题系列 2 1 归一化为什么能提高梯度下降法求解最优解的速度? 22 2 归一化有可能提高精度 22 3 归一化的类型 23 1)线性归一化 23 2)标准差标准化 23 3)非线性归一化 23 35. 什么是熵...

    最新名企标准通用C++面试题,

    C++面试题 参考:http://blog.csdn.net/Ghost90/archive/2009/04/22/4099672.aspx 整理:松鼠 时间:2009-5-8 1、const 有什么用途?(请至少说明两种) 答: (1)可以定义 const 常量 (2)const可以修饰函数的...

    java 面试题 总结

    如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 15、error和exception有什么区别? error 表示恢复不是...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    java综合试题(面试题)

    6、Java源程序在转换为机器语言执行过程中既有编译也有解释。 ( ) 7、// 是java的多行注释符。 ( ) 面向对象 3.Java 仅支持类间的单重继承。 ( ) 17.方法可以没有返回值,或有一个返回值,也可以有多个返回值。...

    php面试题应对笔试的好东西

    写一个函数,算出两个文件的相对路径  如 $a = '/a/b/c/d/e.php';  $b = '/a/b/12/34/c.php';  计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上 答:function getRelativePath($a, $b) { $returnPath =...

    leetcode中文版-Algorithms_Of_Interview:计算机视觉算法工程师面试中手撕代码的算法题总结

    leetcode中文版 计算机视觉算法工程师面试中手撕代码的算法题总结 微软、商汤、旷视、头条、...求一个数组中只包含0,1使得其中0,1个数相等的最大子数组 17.给定一个数组A,求max(Ai - Aj)。其中 i &lt; j 。 18.扎气球

    二进制图文详解

    2进制数有同样现象:数字向右移动一次,原数据除以2 n = 00000000 00000000 00000000 01010000 m = n&gt;&gt;3; m = 00000000000 00000000 00000000 01010 案例: n = 80;// 0x50 m = n&gt;&gt;3;// n //按照2进制输出 ...

    面试题 08.11. 硬币

    给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 解题思路1.错误思路,首先想到的就是回溯法,画出解法空间   对于n=25找零方式...

    世界500强面试题.pdf

    1.4.8. 计算 1 到 N 的十进制数中 1 的出现次数 ............................................. 97 1.4.9. 栈的 push、pop 序列[数据结构] .......................................................... 99 1.4.10....

    js 判断一个数字是不是2的n次方幂的实例

    昨天去面试时,面试官问了一道面试题,说如何判断一个数是不是2的n次方幂,我当时不知道2的n次方幂是什么(糗大发了),还好给我解释了一下。最后回家上网查查资料,整理了一下方法。 方法一 如何判断一个数是否是2...

    holbertonschool-interview:霍尔伯顿学校专业课程的面试练习题

    每个框的编号从0到n - 1依次编号,每个框可能包含指向其他框的键。 框0解锁。 编写一个canUnlockAll(boxes)方法,如果可以打开所有框,则返回True否则,返回True 。 否则为False 。 您将得到一个整数number和head...

    剑指Offer(Python多种思路实现):斐波那契数列

     n=0时,f(n)=0 n=1时,f(n)=1 n&gt;1时,f(n)=f(n-1)+f(n-2) 解题思路一:基于循环【推荐】 # 基于循环【推荐】 class Solution: def Fibonacci(self, n): small, big=0, 1 if n&lt;=0: return 0 if n==1: ...

Global site tag (gtag.js) - Google Analytics