一种是Brute force,O(nlogn)

另一种是找规律O(n),见http://hawstein.com/posts/20.4.html

当某一位的数字小于2时,那么该位出现2的次数为:更高位数字x当前位数
当某一位的数字大于2时,那么该位出现2的次数为:(更高位数字+1)x当前位数
当某一位的数字等于2时,那么该位出现2的次数为:更高位数字x当前位数+低位数字+1
package Hard;

/**
* Write a method to count the number of 2s between 0 and n. 译文: 写一个函数,计算0到n之间2的个数。
*
*/
public class S18_4 { // O(n)
public static int count2s(int n){
int count = 0;
int factor = 1;
int low = 0, cur = 0, high = 0; while(n/factor != 0){
low = n - (n/factor) * factor; // 低位
cur = (n/factor) % 10; // 当前位
high = n / (factor*10); // 高位 if(cur < 2){
count += high * factor;
}else if(cur > 2){
count += (high+1) * factor;
}else{
count += high*factor + low + 1;
} factor *= 10;
} return count;
} //============================================= public static int numberOf2s(int n) {
int count = 0;
while (n > 0) {
if (n % 10 == 2) {
count++;
}
n = n / 10;
}
return count;
} // Brute force way O(nlogn)
public static int numberOf2sInRange(int n) {
int count = 0;
for (int i = 2; i <= n; i++) { // Might as well start at 2
count += numberOf2s(i);
}
return count;
} public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
int b = numberOf2sInRange(i);
int v = numberOf2sInRange(i);
System.out.println("Between 0 and " + i + ": " + v + ", " + b);
}
} }

Hard 计算0到n之间2的个数 @CareerCup的更多相关文章

  1. 统计0到n之间1的个数

    问题描写叙述 给定一个十进制整数N,求出从1到N的全部整数中出现"1"的个数. 比如:N=2时 1,2出现了1个 "1" . N=12时 1,2,3,4,5,6 ...

  2. 统计0到n之间1的个数[数学,动态规划dp](经典,详解)

    问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数.  例如:N=2时 1,2出现了1个 “1” . N=12时 1,2,3,4,5,6,7,8,9,10,11,12.出现了5个 ...

  3. 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?

    题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...

  4. 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离。显示为公里、米

    /** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( ...

  5. IOS 计算两个经纬度之间的距离

    IOS 计算两个经纬度之间的距离 一 丶 -(double)distanceBetweenOrderBy:(double) lat1 :(double) lat2 :(double) lng1 :(d ...

  6. java中计算两个日期之间天数的程序设计。

    //用java编写出一个以下方法计算两个日期之间天数的程序设计. import java.util.regex.Matcher; import java.util.regex.Pattern; pub ...

  7. opencv计算两个轮廓之间hu矩相似程度,MatchShapes

    https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn. ...

  8. 计算2个时间之间经过多少Ticks

    Ticks是一个周期,存储的是一百纳秒,换算为秒,一千万分之一秒.我们需要计算2个时间之间,经过多少Ticks,可以使用下面的方法来实现,使用2个时间相减. 得到结果为正数,是使用较晚的时间减去较早的 ...

  9. 高德地图 API 计算两个城市之间的距离

    1. 目前在项目中,遇到一个需求不会做,就是要计算两个城市之间的距离,而这两个城市的输入是可变的,如果要使用数据库来先存储两地之间的距离,调用的时候再来调用,那么存数据的时候,要哭的,因为光是省级区域 ...

随机推荐

  1. 从零开始学java(猜数字游戏)

    练练手不喜勿喷,看到什么学习什么第一次发博客格式就见见谅.....                                            2016-07-21 19:55:02 imp ...

  2. 通用数据挖掘[ZZ]

    一.什么是数据挖掘?许多人认为数据挖掘更像是一门哲学,或数学的组成部分,而不是业务需求的实际解决方案.您可以从采用的各种定义中看出这一点,例如:“数据挖掘是对非常大型的数据进行的研究和分析,采用自动或 ...

  3. javascript——面向对象程序设计(1)

    <script type="text/javascript"> //ECMA-262把对象定义为:“无序属性的 集合,其属性可以包含基本值.对象或者函数” //理解对象 ...

  4. SQL2012之FileTable与C#的联合应用

    关于FileTable是什么,请猛击如下链接:http://technet.microsoft.com/zh-cn/library/ff929144(v=SQL.110).aspx:如您已知道,请跳过 ...

  5. 关于点击空白关闭弹窗的js写法推荐?

    $(document).mouseup(function(e){ var _con = $(' 目标区域 '); // 设置目标区域 ){ // Mark 1 some code... // 功能代码 ...

  6. C#实现对邮件的发送

    首先是邮件帮助类 using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; u ...

  7. EntityFramework - Migrations

    EntityFramework  - Migrations 對項目進行EF的數據庫升級操作.分爲開發環境與部署環境.上的操作總結. 引用: Command說明https://coding.abel.n ...

  8. 递归删除.DS_Store文件

    删除svn文件 sudo find . -name ".DS_Store" -exec rm -r {} \; sudo find . -name ".git" ...

  9. BZOJ 1296 粉刷匠

    Description windy有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. ...

  10. Journey of Android for Mac

    下了决心要学Java,几个同事都建议我去学Android,自己觉得能做点应用放手机上玩玩也比较有动力. 沈逸有篇文章里面写道: 搞C的看不起搞C++的. 搞C++的看不起搞java的. 搞java的看 ...