剑指 Offer 43. 1~n 整数中 1 出现的次数

2023-11-11

目录

​编辑

一,问题描述

二,例子

 三,题目接口

四,题目解答

1,暴力解法

2.规律解法

总结:

代码:

 


 

 

一,问题描述

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

二,例子

先来看看题目的例子:

在例1中给出的n=12,那答案便是5。为什么呢?先来看看1~12之间的数字:

1,2,3,4,5,6,7,8,9,10,11,12。在这一组数字中,出现1的数字有:1,10,11,12。刚好就是5五个所以答案就是5。

 三,题目接口

class Solution {
public:
    int countDigitOne(int n) {
        

    }
};

四,题目解答

1,暴力解法

不得不说,暴力解法写起来特别简单。一个for循环加上一个while循环便可以了。其中for循环的作用便是用来将1~n的数字遍历,while循环的作用是求遍历进来的数的每一位上的数字是否为1。根据以上思路写出的代码如下:

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

    }
};

但是,遗憾的告诉大家这个代码是过不了的。因为n可以变得很大:

 在这里将count改为long long 类型也没有用。

2.规律解法

在这里先说一下这个解法的步骤:

1.首先来定义几个变量:cur,high,cur,bit,ans。这几个变量都是一些数字。对于一个数520122,它们的对应关系如下:

 对于现在这个cur指向最低位的2时,我们可以假设cur指向的数字变成了1。对于这个最后一位为1时这个六位数有多少个组合呢?是不是有(52012+1) = (high+1)种组合啊?如下图:

现在cur往前移一位,变成下面的样子:

 

 

还是将cur指向的2变成1,这个时候对于十位上的数变成1会有多少种组合呢?

对于右边还是(5201+1)=(high+1)种。但是对于左边可不是(2+1) = (low+1)种。而是bit种。为什么呢?因为当cur指向的数字大于1时,那cur的下一位便可以变成0~9中的任何一个数字共有10种。也就是bit种。所以这里的组合有(5201+1)*10 =(high+1)*bit种。

       接下来再次移动cur,如下图:

 这时对于cur指向的数字为1时的搭配便是520*100+(22+1) = high*bit+(low+1)种了。

因为cur指向的是数字1,所以为了保证搭配成的组合数比n小。high指向的组合可以分为两种情况。1,high取到了520,那此时low只能取:00~22。2.当high取到:000~519这520种情况时,那low可以取:00~99共100种,也就是bit种。

    现在继续移动cur:

此时cur指向的数字变成了0。若要让该位置上的数字变成1并且让得到的数字比n小,那high就只能取到:00~51共52个数,在取这52个数是low是没有限制的,所以low可以取到0~999的数字。所以当cur位为1时共有52*1000 =high*bit种搭配。 

总结:

求到这时规律已经出现:

cur>1共有:(high+1)*bit种

cur = 1共有:hight*bit+(low+1)种

cur = 0共有:hight*bit种

并且:

cur = (n/bit)%10

low = n%bit

hight = n/bit/10。

代码:

class Solution {
public:
    int countDigitOne(int n) {
       long long sum = 0;
       long long bit = 1;

       while(bit<=n)
       {
           long long cur = (n/bit)%10;
           long long low = n%bit;
           long long high = n/bit/10;

           if(cur == 0)
           {
               sum+=high*bit;
           }
           else if(cur == 1)
           {
               sum+=high*bit+(low+1);
           }
           else
           {
               sum+=(high+1)*bit;
           }
           bit*=10;
       }

       return sum;
    }
};

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指 Offer 43. 1~n 整数中 1 出现的次数 的相关文章

随机推荐

  • WPF+EF Core入门:制作可视化窗体软件

    原因 最近要面试一家公司 公司有对WPF架构的要求 然后就开始自学了 功能描述 加载所有学生信息 名字筛选学生信息 重置筛选 新增学生信息 修改学生信息 删除学生信息 窗体样式 操作步骤 一 引用文件包 进去管理NuGet程序包 引入EF
  • 使用centos7搭建syslog和loganalyzer日志服务器

    主要步骤是网上根据博客来安装及排错调试 这两张帖子都写的很详细 http www ifzhai com article php id 9 https blog csdn net qq 33157780 article details 506
  • java String类(超详细,含常用方法、面试题,内存图,案例)

    String类 一 String类的特点 二 String 类的常见构造方法 三 String常见的面试题 1 字符串常量池 2 String s abc 与String s new String abc 区别 3 字符拼接 4 常量优化机
  • pgsql数据库存储过程中,批量操作数据

    82 数据库存储过程中 批量操作数据 DECLARE record row record 定义一个名为 record row 的记录类型变量 BEGIN FOR record row IN SELECT name age id card F
  • Python制作宝石消消乐小游戏

    开发工具 Python版本 3 6 4 相关模块 pygame模块 以及一些Python自带的模块 相关文件 关注公众号 Python学习指南 回复 消消乐 即可获取 环境搭建 安装Python并添加到环境变量 pip安装需要的相关模块即可
  • Unity简单几行代码让玩家水平移动更丝滑真实

    可以先来看看基础的移动代码 接收玩家的输入 然后赋予刚体速度 但是这种写法存在几个问题 下面一一纠正 首先 如果直接改变刚体的速度 那么可能会出现穿墙的问题 而且没有一种从速度0到缓慢加速的过程 那样较为机械且不真实 所以可以用物理模拟的方
  • Leetcode 448.找到所有数组中消失的数字

    448 找到所有数组中消失的数字 力扣 LeetCode 题目描述 给你一个含 n 个整数的数组 nums 其中 nums i 在区间 1 n 内 请你找出所有在 1 n 范围 但没有出现在 nums 中的数字 并以数组的形式返回结果 示例
  • openAI api 生产最佳实践

    生产最佳实践 本指南提供了一套全面的最佳实践 帮助您从原型过渡到生产 无论您是经验丰富的机器学习工程师还是最近的爱好者 本指南都应为您提供将平台成功投入生产环境所需的工具 从确保访问我们的API到设计能够处理高流量的健壮架构 使用本指南可帮
  • Python-matplotlib画图(莫烦笔记)

    https www zhihu com collection 260736383 lt 此处就不自己写了 看了遍 照着写了一边 作者写的不错 不过有些有些偷懒 我只做了常见的功能 gt 作者 触摸壹缕阳光 链接 https zhuanlan
  • 如何创建你的第一个西门子200PLC程序

    更多关于西门子S7 200PLC内容请查看 西门子200系列PLC学习课程大纲 创建西门子200PLC程序分五步 1 打开Micro WIN软件 2 新建工程 3 打开程序编辑器 4 输入程序指令 5 保存程序 我们以下图程序为例讲解西门子
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 作者 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 文章目录 0x00 前言简述 0x01 超链接标签元素 a 标签 0x02 框架标签元素 iframe 标签
  • Android性能优化 _ 把构建布局用时缩短 20 倍(下),轻松拿下offer

    scaleType ImageView ScaleType FIT XY setImageResource R drawable user portrait gender female also addView it also addVie
  • Spring Boot、Dubbo项目Mock测试踩坑与总结

    本文是对Spring Boot Dubbo项目进行Mock测试的总结与踩坑实录 搜索了一圈 居然没发现类似的文章 莫非用Dubbo的朋友们都不Mock测试 或者有其他的办法测试吗 简单总结了一下 希望对大家能有一定参考意义 如果有更好的测试
  • 小影服务器维修,轩辕传奇2月27日所有服务器停服更新公告

    尊敬的轩辕勇士们 我们计划将于2月27日上午9 00 11 00期间对所有服务器进行停服更新 在更新期间 所有服务器的玩家将暂时无法进入游戏 停服更新结束后 所有服务器的玩家将更新到最新版本 版本号为 1 11 107 2 同时 官网会在更
  • 菜鸟的刷题之路之二叉树

    成功不是终点 失败不是终结 勇气才是启程的第一步 作者 不能再留遗憾了 专栏 菜鸟的刷题之路 本文章主要内容 将有序数组转换为二叉搜索树 二叉搜索树中第K小的元素和叶子相似的树的详细题解 文章目录 将有序数组转换为二叉搜索树 题目要求 做题
  • spring boot 整合dubbo2.7.8

    由于dubbo2 7 8之前的版本有漏洞 项目需要升级至2 7 8 之前用的是阿里的dubbo 在版本切换上遇到过一些问题 特记录一下心得 首先讲下dubbo的版本 dubbo在2 6版本是阿里在管理和维护 后面交给了apache管理 2
  • Linux(一):Linux入门

    概述 Linux 是一套免费使用和自由传播的类 Unix 操作系统 Linux 英文解释为 Linux is not Unix 同时基于多用户 多任务 支持多线程和多 CPU 的操作系统 目前很多企业采用CentOS 本文后续涉及到linu
  • Make sure ‘SystemCfg‘ is registered using qRegisterMetaType

    最近在编写Qt代码的时候遇到标题上的问题 现象是 在收到一个xml字符串需要解析时 我放在线程里面处理 然后线程执行完成后将xml对应的结构体返回给主线程 在主线程的槽函数中始终接收不到 但是在子线程中emit函数是执行过的 在调试窗口中看
  • github push时提示Username for ‘https://github.com‘ 解决办法

    今天进行push的时候一直提醒我输入Username还有PassWord 还出现提示 remote Support for password authentication was removed on August 13 2021 起初我以
  • 剑指 Offer 43. 1~n 整数中 1 出现的次数

    目录 编辑 一 问题描述 二 例子 三 题目接口 四 题目解答 1 暴力解法 2 规律解法 总结 代码 一 问题描述 输入一个整数 n 求1 n这n个整数的十进制表示中1出现的次数 例如 输入12 1 12这些整数中包含1 的数字有1 10