题目链接: 剑指offer啊

  题目描述: 输入N, 求从1到n整数中1出现的次数

  解题思路: 一开始的想法只能是暴力, 但是自己太蠢了啊, 看了看剑指offer上的做法就是巧妙的利用了递归......一个数字可以拆成两部分: 拿21345举例来说, 可以拆成两部分:

        1 ~ 1345,   01346 ~ 21345, 我们为什么要拆成这两个串呢, 因为第二部分我们可以准确的知道1 出现的次数, (拿第一位的值进行分类讨论), 第一部分我们可以递归, 这样我们就将问题划分成更小的子问题了, 所以问题可以求解, 注意边界情况子串长度为1 的时候, 和到字符串结尾 '\0' 的时候

  代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
using namespace std;const int maxn = 1e2;int PowerBase10(int a, int n) {int res = 1;for( int i = 0; i < n; i++ ) {res *= 10;}return res;
}int NumberOf1(const char *strN) {if( !strN || *strN < '0' || *strN > '9' || *strN == '\0' ) return 0;int first = *strN-'0';int len = (int)strlen(strN);if( len == 1 && first == 0 ) return 0;else if( len == 1 && first == 1 ) return 1;int NumberFirstDigit = 0;if( first >= 2 ) {NumberFirstDigit += PowerBase10(10, len-1);}else {NumberFirstDigit += atoi(strN+1) + 1;}int NumberOtherDigit = first*(len-1)*PowerBase10(10, len-2);int NumberRecursive = NumberOf1(strN+1);return NumberFirstDigit + NumberOtherDigit + NumberRecursive;
}int NumberOf1Between1AndN( int n ) {char str[maxn];if( n <= 0 ) return 0;sprintf( str, "%d", n );return NumberOf1(str);
}int main() {int n;scanf( "%d", &n );printf( "%d\n", NumberOf1Between1AndN(n) );return 0;
}

View Code

  思考: 通过这道题更加深刻地理解了递归, 我认为递归的用途是, 至少在本道题来讲, 如果说一个问题, 可以化成子问题 + ..... + 子问题 + 常数, 那么这道题就可以用递归的思想去解决

明天要去问面试结果了, 感觉自己的希望很小很小, 但是还是要问问, 哎, 今天晚上又该闹心了, 玻璃心, stupid

转载于:https://www.cnblogs.com/FriskyPuppy/p/7512081.html

剑指offer 面试题32 从1到n整数中1出现的次数相关推荐

  1. 剑指offer——面试题32:从1到n整数中1出现的次数

    剑指offer--面试题32:从1到n整数中1出现的次数 Solution1: 最容易想到的方法: class Solution { public:int NumberOf1Between1AndN_ ...

  2. 剑指offer——面试题38:数字在排序数组中出现的次数

    剑指offer--面试题38:数字在排序数组中出现的次数 20180906整理 Solution1: [注意]先利用二分查找扎到一个值然后再顺序遍历的做法时间复杂度也是O(n)O(n)O(n),代码也 ...

  3. 剑指offer面试题[32]:从1到n整数中1出现的次数

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

  4. 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...

  5. 面试题32.从1到n整数中1出现的次数

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从 1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计 ...

  6. 剑指Offer - 面试题32 - III. 从上到下打印二叉树 III(BFS,queue+stack)

    1. 题目 请实现一个函数按照之字形顺序打印二叉树, 即第一行按照从左到右的顺序打印, 第二层按照从右到左的顺序打印, 第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9 ...

  7. 剑指Offer - 面试题32 - I. 从上到下打印二叉树(按层BFS遍历,queue)

    1. 题目 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7],3/ \9 20/ \15 7 返回: [3,9 ...

  8. 剑指offer面试题32 - III. 从上到下打印二叉树 III(二叉树)(BFS)

    题目描述 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 思路 详见链接 代码 class So ...

  9. 剑指offer面试题32 - I. 从上到下打印二叉树(二叉树)(BFS)

    题目描述 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 思路 详见链接 代码 class Solution:def levelOrder(self, root:TreeNode ...

最新文章

  1. 电脑桌面便签小工具_可以直接在桌面上显示内容的便签软件电脑版
  2. 编程之美——2.7 求最大公约数
  3. 最新发布丨游戏市场“超预期”增长背景下,如何加速产品精品化 运营精细化?...
  4. EF 如何更新多对多关系的实体
  5. 字典树(Trie tree)
  6. HDU - 5381 The sum of gcd(莫队/线段树区间合并)
  7. 计算机软件名称用什么符号,[计算机软件及应用]第九章符号表.ppt
  8. KuaiRec | 快手发布首个稠密度高达99%的推荐数据集, 可用于多种推荐系统方向研究...
  9. 天池学习赛——街景字符编码识别(得分上0.93)
  10. c# 定义委托和使用委托(事件的使用)
  11. 自制Json解析工具(易语言)
  12. python:实现杨辉三角
  13. 华为笔记本没有网线口_笔记本电脑没有网线接口的怎么办?
  14. Visio流程图配色
  15. html的视频字幕制作步骤,视频字幕制作软件如何制作视频滚动字幕|滚动字幕视频制作...
  16. 趣谈网络协议-应用层(P2P协议)
  17. 什么是数位板? 数位板,又名绘图板、绘画板、手绘板等等,是计算机输入设备的一种,通常是由一块板子和一支压感笔组成,它和手写板等作为非常规的输入产品相类似,都针对一定的使用群体。 与手写板所不同的是
  18. linux下设置共享目录
  19. oracle 判断重复次数,sql 查询 某字段 重复次数 最多的记录
  20. python中可选参数是什么意思_什么是python的必选参数

热门文章

  1. 西铁院云计算机室与应用,关于开展“云桌面应用”技术服务的通知
  2. whoosh mysql_使用WhooshAlchemy报错'function' object has no attribute 'config'
  3. pe系统如何读取手机_图文详解怎么用pe重做系统
  4. vissim跟驰模型_MATLAB——基于元胞自动机的单向3车道模型
  5. 图片背景虚化_如何用PPT制作图片虚化背景?
  6. linux proc io,在/proc/[pid]/io 中,理解计数器_linux-kernel_开发99编程知识库
  7. js byte数组转string_JVM系列之:String,数组和集合类的内存占用大小
  8. k2p一直亮红灯搜不到信号_周迅感情亮红灯?真离了!?亮红灯英文是red light ?red 对了,但不用 light!...
  9. html动态生成按钮事件,javascript 动态生成按钮并添加事件时为什么不响应?
  10. 使用screen的时候出现了如下错误: Cannot open your terminal '/dev/pts/0' - please check.