题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

  见到这道题的第一反应可能是我可以先计算1~n每个数中1出现的次数,然后把所有结果相加即可。此时,时间复杂度为O(n*log(n)).

  接下来是一种时间复杂度为O(log(n))的解法(这里以一个具体的例子来进行说明):n=2234

  1.将2234分为1~234,235~2234两段;

  2.计算235~2234数字中出现1的次数。首先,出现在最高位上出现的次数。这里最高位为千位,由于最高位大于1,从1000~1999中,1一共出现103次;若最高位等于1,则1在最高位出现的次数为除去最高数字之后剩下的数字加1。其次,计算除去最高位外剩余位上出现的1.这里可以再将区间进行划分:235~1234和1235~2234.每段上出现1的次数是相同的:除去最高位剩余3位,选择其中一位是1,其余两位可以在0~9这10个数字中任意选择,所以每段出现的次数为3*102。最后,综合上述两步,在235~2234数字中出现1的次数为103+2*3*102;

  3.递归采用步骤1,2计算1~234中出现1的次数。

  public class Num31_NumberOf1Between1AndN {

      public int NumberOf1Between1AndN_Solution(int n) {
int res = 0,len=1,num=n;
while((num/10)!=0){
len++;
num = num/10;
}//求出是几位数
res = doSum(n,len);
return res;
}
public int doSum(int end,int len) {
//若为1~0或者长度为0,直接返回0
if(end == 0||len==0)return 0;
//只剩一位的情况
if(len == 1 && end ==0)return 0;
if(len == 1 && end > 0)return 1; int high,rest;
int pow = (int)Math.pow(10, len-1);//10^(len-1)
int mul = end/pow;//最高位
//求最高位上1的个数
if(mul==1)
high = end-pow+1;
else high = pow;
rest = mul * (len-1)*(pow/10);//除最高位以外,剩余位出现1的个数
//和的前两项为(end%pow+1 ~ end)中1出现的次数
//和的最后一项(1 ~ end%pow)中1的出现的次数
return high + rest +doSum(end-mul*pow,len-1);
}
}

整数中1出现的次数(从1到n整数中1出现的次数)的更多相关文章

  1. 整数中1出现的次数(从1到n整数中1出现的次数)

    整数中1出现的次数(从1到n整数中1出现的次数) 题目描述 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1 ~ 13中包含1的数字有1.10 ...

  2. 剑指Offer-31.整数中1出现的次数(从1到n整数中1出现的次数)(C++/Java)

    题目: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.A ...

  3. 31.整数中1出现的次数(从1到n整数中1出现的次数)

    题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...

  4. php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpos

    php字符串查找函数 php查找字符串中出现的次数函数substr_count,判断字符串中是否包含另一个字符串函数strpossubstr_count($haystack, $needle [,$o ...

  5. python1.返回一个字符串中出现次数第二多的单词 2.字符串中可能有英文单词、标点、空格 3.字符串中的英文字符全部是小写

    import re from collections import Counter def second_count_word(s): # # 利用正则按标点和空格切割,有其他标点可以添加到[]内 # ...

  6. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组

    题目描述: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...

  7. LoadRunner中Action的迭代次数的设置和运行场景中设置

    LoadRunner中Action的迭代次数的设置和运行场景中设置 LoadRunner是怎么重复迭代和怎么增加并发运行的呢? 另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢? ...

  8. 对于大于等于3的整数n,在区间【n,3/2 * n】中一定存在一个素数

    对于大于3的整数n,在区间[n,3/2 * n]中一定存在一个素数

  9. 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  10. Python学习之---Python中的内置函数(方法)(更新中。。。)

    add(item)   #将item添加到s中,如果item已经在s中,则无任何效果 break        #退出循环,不会再运行循环中余下的代码 bool()     #将参数转换为布尔型 by ...

随机推荐

  1. ASP.NET MVC增删改查

    ASP.NET MVC中的增删改查 基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回 ...

  2. css学习归纳总结(一) 转

    原文地址:CSS学习归纳总结(一) 选择器的分组 CSS选择器分为 1.群组选择器 如:p, body, img, div{} 2.兄弟选择器 如:p + p { color:#f00; } 3.属性 ...

  3. 删除Xcode中的 证书文件

    Finder->前往 ~/Library/MobileDevice/Provisioning Profiles

  4. 聚光灯下的熊猫TV技术架构演进

    2015年开始的百播大战,熊猫TV是其中比较特别的一员. 说熊猫TV是含着金钥匙出生的公子哥不为过.还未上线,就频频曝光,科技号,微博稿,站上风口浪尖.内测期间更是有不少淘宝店高价倒卖邀请码,光内测时 ...

  5. web前端面试题

    HTML+CSS 1.对WEB标准以及W3C的理解与认识 标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外链css和js脚本.结构行为表现的分离.文件下载与页面速度更快.内容能被更多的用户 ...

  6. udev

    1.作为devfs的代替者,传统的devfs不能动态分配major和minor且有限,udev能像DHCP动态的分配IP一样去分配major和minor 2.device naming提供命名持久化机 ...

  7. [WebServer] Tomcat 配置访问限制:访问白名单和访问黑名单

    前言: 昨天配置了 Tomcat 服务器运行 PHP 的环境,但是通过观察 Tomcat 这几天的日志发现,有很多莫名其妙的 IP 访问主机下莫名其妙的地址,如:/80./testproxy.php. ...

  8. win7系统 .chm文件打不开的解决办法

    一.正确操作方法1.鼠标右键单击该CHM文件,在右键快捷窗口中选择“打开方式”-“Microsoft HTML Help Executable”:2.如果出现一个提示窗口,大意是说,该CHM文件的发行 ...

  9. Eclipse智能提示及快捷键

    1.java智能提示 (1). 打开Eclipse,选择打开" Window - Preferences". (2). 在目录树上选择"Java-Editor-Conte ...

  10. 在Django中进行注册用户的邮件确认

    之前利用Flask写博客时(http://hbnnlove.sinaapp.com),我对注册模块的逻辑设计很简单,就是用户填写注册表单,然后提交,数据库会更新User表中的数据,字段主要有用户名,哈 ...