题目描述

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

直观的解法:累加1到n之间的每个数中1出现的个数(每次求除以10的余数,除以10再求)。数n有logn位。

时间复杂度O(nlogn)

class Solution {
public:int NumberOf1Between1AndN_Solution(int n){int number = 0;for(int i = 1; i <= n; i++){number += NumberOf1(i);}return number;}int NumberOf1(int n){int number = 0;while(n){if(n % 10 == 1)number++;n /= 10;}return number;}
};

用一个大一点的数字21345作为例子来分析其中的数字规律。分成两段:1~1345,1346~21345。

先分析1346~21345段。最高位为1的情况有多少种呢?10000~19999(10^4个)。如果n的最高位为1,则只有10000~11345(除去最高位数字再加1种)。

再分析剩下4位中某位为1的情况:这里再将1346~21345分成两段1346~11345,11346~21345。每一段1的个数是:4*10^3 (其他3位可取0~9共10位数字中的任何一个)。

接下来递归分析1~1346中1个个数。

总递归次数等于n的位数。

时间复杂度O(logn)(底数是10)

#include<cstdio>
class Solution {
public:int NumberOf1Between1AndN_Solution(int n){if(n <= 0) return 0;char strN[50];sprintf(strN, "%d", n);return NumberOf1(strN);}int NumberOf1(const char* strN){if(!strN || *strN < '0' || *strN > '9' || *strN == '\0')return 0;int first = *strN - '0';unsigned int length = static_cast<unsigned int>(strlen(strN));if(length == 1 && first == 0)return 0;if(length == 1 && first > 0)return 1;int numFirstDigit = 0;if(first > 1)numFirstDigit = PowerBase10(length-1);else if(first == 1)numFirstDigit = atoi(strN+1) + 1;int numOtherDigits = first * (length - 1) * PowerBase10(length - 2);int numRecursive = NumberOf1(strN + 1);return (numFirstDigit + numOtherDigits + numRecursive);}int PowerBase10(unsigned int n){int result = 1;for(unsigned int i = 0; i < n; i++)result *= 10;return result;}
};

其他人的思路 1

其他人的思路 2

public int NumberOfXBetween1AndN_Solution(int n,int x) {if(n<0||x<1||x>9)return 0;int high,low,curr,tmp,i = 1;high = n;int total = 0;while(high!=0){high = n/(int)Math.pow(10, i);// 获取第i位的高位tmp = n%(int)Math.pow(10, i);curr = tmp/(int)Math.pow(10, i-1);// 获取第i位low = tmp%(int)Math.pow(10, i-1);// 获取第i位的低位if(curr==x){total+= high*(int)Math.pow(10, i-1)+low+1;}else if(curr<x){total+=high*(int)Math.pow(10, i-1);}else{total+=(high+1)*(int)Math.pow(10, i-1);}i++;}return total;
}

剑指offer——整数中1出现的次数(从1到n整数中1出现的次数)相关推荐

  1. 【剑指offer】leetcode刷题 -- Python3实现 -- 共75题(更新中)

    目录: 1. 剑指 Offer 03. 数组中重复的数字 -- 简单2. 剑指 Offer 04. 二维数组中的查找 -- 简单3. 剑指 Offer 05. 替换空格 -- 简单4. 剑指 Offe ...

  2. 《剑指offer》第四十三题(从1到n整数中1出现的次数)

    // 面试题43:从1到n整数中1出现的次数 // 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如 // 输入12,从1到12这些整数中包含1 的数字有1,10,11和12 ...

  3. 《剑指offer》-- 第一个只出现一次的字符、数组中只出现一次的数字、字符流中第一个不重复的字符、数组中重复的数字

    一.第一个只出现一次的字符: 1.题目: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写 ...

  4. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

  5. [剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]

    [问题描述][困难] [解答思路] 1. 思路1 时间复杂度:O(logN) 空间复杂度:O(N) import java.util.PriorityQueue;public class Median ...

  6. java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

    前言 众所周知,<剑指offer>是一本"好书". 如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白. 对于剑指offer题解这个系列,我的 ...

  7. 【剑指offer】【leetcode精选题集】【Java】剑指offer题解合集 更新中

    Leetcode题集 [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet] [剑指offer][JAVA]面试题第[04]题[二维数中的查找][数组] [剑指offe ...

  8. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  9. 【剑指Offer学习】【全部面试题汇总】

    剑指Offer学习 剑指Offer这本书已经学习完了.从中也学习到了不少的东西,如今做一个总的文件夹.供自已和大家一起參考.学如逆水行舟.不进则退.仅仅有不断地学习才干跟上时候.跟得上技术的潮流! 全 ...

  10. 《剑指offer》题目说明

    剑指offer推荐刷题地址: Leetcode: https://leetcode-cn.com/problemset/lcof (官方授权) 牛客网:https://www.nowcoder.com ...

最新文章

  1. 就在明天!对话晶泰科技赖力鹏:AI制药独角兽的崛起之路
  2. 新年红包封面来了,3000万份红包封面来啦!到点直领!
  3. sharepoint对象模型性能比较
  4. linux 1号硬盘不能用,linux 挂载硬盘的疑问 : IDE1 上的接口无法使用.
  5. .net 实现Cookie跨域共享,单点登录SSO
  6. jquery获取iframe里的js事件
  7. 农用圆形打捆机行业调研报告 - 市场现状分析与发展前景预测
  8. 【工大SCIR笔记】多模态信息抽取简述
  9. 【C++】内存4区---代码区、全局区、栈区、堆区
  10. 防盗链Nginx设置图片防盗链,设置无效的请仔细看红字
  11. 高数篇(二)-- 傅里叶变换 VS 拉普拉斯变换
  12. coherence mysql_Coherence Step by Step 第三篇 缓存(二) 配置(翻译)
  13. 计算机网络:四类数据编码技术
  14. 侯捷 C++ 课程系列视频 | 侯捷 STL 视频
  15. 一行代码帮你彻底解决pip下载速度慢的问题,更改pip源至国内镜像(无须新建文件夹), 享受飞一般的速度
  16. 十张图带你看中国交通变迁
  17. Banana Pi 消息
  18. MATLAB仪表表盘数字识别解析
  19. 小程序与h5的相互跳转
  20. Android开发——Java代码动态改变图片颜色

热门文章

  1. codevs 3287 货车运输
  2. 学习整理软测----(七)Linux基本介绍以及常用命令
  3. 编程珠玑之第二章习题10
  4. 简单入门Zigbee
  5. 在ubuntu上安装和使用中文输入法的一些经历
  6. 缔尚大师全球首推集成墙面火爆招商!!!
  7. Linq查询DataTable
  8. ARM学习之图解ARM
  9. centos7 samba 离线安装_Centos 7 上安装Samba的详细步骤
  10. C#托盘控件notifyIcon的使用