当前位置: 首页 > news >正文

【算法】【算法杂谈】从1到n的自然数组中,1出现的次数如何计算?

目录

  • 前言
  • 问题介绍
  • 解决方案
  • 代码编写
    • java语言版本
    • c语言版本
    • c++语言版本
  • 思考感悟
  • 写在最后

前言

当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~

在此感谢左大神让我对算法有了新的感悟认识!

问题介绍

原问题
从1到n的自然数组中,1出现的次数如何计算?
如 [1…11] 中有1的有 1,10,11,结果为4

解决方案

原问题
首先给一个示例:n = 114时,求[1…114]之间1的个数
首先我们求15 - 114之间1的个数,然后再求[1…14]之间1的个数,为什么这么来,可以看下面的感 1
15-114之间1的个数如何求?
1、首先百位是1时的数一共有14个,如果百位是2时,则百位是1的个数就是100-199,也就是 10^2个
2、其次求10位是1的个数,百位首先范围只能是1,如果百位是2,那么范围就是[1…2],按照除了十位和百位以外,其他的可以随便取,所以就是10^1个,如果百位是2就是 2 * 10^1个,
3、接下来算个位时同十位相同,那么这个时候你可能会问,个位时1时,十位难道不限制吗?哎,就是不用限制,为什么?看下面1
先看下代码怎么写,然后咱们讨论一下巧妙之处~

代码编写

java语言版本

原问题:
方法一:

  /*** 二轮测试: 给定整数num,求1-num中1出现的次数* @param num* @return*/public static int oneNumCp1(int num) {if (num < 1) {return 0;}if (num < 10) {// 10以内的数只有一个1return 1;}// 计算位数int len = 0;int tem = num;while (tem != 0) {len ++;tem /= 10;}// 求起点tem = num;// 最高位int height = (int)(tem / Math.pow(10, len-1));// 当前轮的起点int start = (int)(tem - (height) * Math.pow(10, len-1)) + 1;// 计算当前层的1的个数int oneNum = 0;// 先计算最高位是1的情况if (height == 1) {// 最高位是1oneNum += start;}else {oneNum += Math.pow(10, len-1);}// 剩余的自由组合oneNum += Math.pow(10, len-2) * height * (len-1);return oneNum + oneNumCp1(start-1);}public static void main(String[] args) {System.out.println(oneNumCp1(114));}

c语言版本

正在学习中

c++语言版本

正在学习中

思考感悟

写在最后

方案和代码仅提供学习和思考使用,切勿随意滥用!如有错误和不合理的地方,务必批评指正~
如果需要git源码可邮件给2260755767@qq.com
再次感谢左大神对我算法的指点迷津!


  1. 首先这个答案可以解释上面两个疑惑:
    为什么偏偏计算15-114呢?就是因为我们在计算个位(后面可能是低位)的时候,以为十位可能会被限制为1,不能为2,这样计算起来很麻烦,所以这里取巧了,将15-99的数字全部加载114的后面,这样就凑齐了100-199,这样计算个位就不会被10位限制,很显然后续的计算直接计算1-15,也不会再计算15-99了。
    2、现在114并不典型,我们需要注意一下214的情况:
    214的解法仍然是求15 - 214先,我们发现15-99能够填充214到299,首先算十位是没有变化的(注意十位是1时百位是2时,219等价于 019 )虽然219不存在,但是019能够作为代替,这也解释了为什么百位不能为1,只能是1-2的范围。
    3、还有一个容易误会的地方就是刚开始我会觉得当十位是1的时候,个位会有1的时候,那么计算个位1的时候十位也会有1的时候,是否会有重复?
    这里是一个理解误区,我们在计算1的个数时,如果有一个数是111,那么这个数应该被计数三次才对,很显然我们在排列组合的时候会计算三次,完全没有问题! ↩︎ ↩︎

相关文章:

【算法】【算法杂谈】从1到n的自然数组中,1出现的次数如何计算?

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…...

日常笔记-Flutter build命令参数

Flutter build命令参数 Flutter build命令参数 Flutter build命令参数 flutter build apk 命令支持以下参数&#xff1a; --debug&#xff1a;构建一个调试版本的 APK。--release&#xff1a;构建一个发布版本的 APK。--target-platform<value>&#xff1a;指定目标平台…...

【利用AI让知识体系化】入门Koa框架

思维导图 文章目录 思维导图一、介绍Koa什么是KoaKoa的历史Koa的特点 二、基本使用安装KoaHello World中间件路由错误处理 三、进阶使用静态资源管理Session管理文件上传表单处理HTTPS支持 四、Koa中间件中间件的概念Koa的洋葱模型常用中间件的介绍自定义中间件的编写 五、异步…...

边缘计算:数据采集、清洗与处理的新时代

近日&#xff0c;又一家边缘计算企业成功获得了融资。这家公司名为DeepWalk&#xff0c;致力于提供边缘计算技术&#xff0c;为企业提供安全、快速的数据采集、清洗和处理解决方案。其融资将用于产品研发和市场推广。 DeepWalk成立于2018年&#xff0c;总部位于美国硅谷&#x…...

分区计量管理项目应用

为充分发挥分区计量管理项目在漏损控制的效用&#xff0c;应构建科学完备的应用体系&#xff0c;如下图 分区计量应用体系 1. 基于水量平衡分析的漏损现状评估方法 分区计量管理项目通过监控分析DMA 分区内流量、压力、水质、大用户用水等情况&#xff0c;结合营业抄收系统的营…...

LayoutInflater中inflate()参数解析

1、关于LayoutInflater&#xff0c;它是如何通过 inflate 方法获取到具体View的&#xff1f; 获得LayoutInflater实例的方式有以下三种&#xff1a; LayoutInflater inflater getLayoutInflater();LayoutInflater inflater LayoutInflater.from(this);LayoutInflater infla…...

星河案例ㅣ中国电信 X 冲量在线:基于智算中心的隐私计算应用实践

▏摘要 中国电信是中国三大运营商之一&#xff0c;为响应国家“东数西算”工程的全新数据中心形态&#xff0c;中国电信引入隐私计算平台&#xff0c;对内实现数据确权跟踪、对外实现数据共享交易&#xff0c;盘活中国电信分布在全国不同区域的数据资源和算力资源&#xff0c;…...

开发笔记之:JAVA读取QT QDataStream输出

1.背景 之前的标题是【JAVA反序列化QT序列化内容】&#xff0c;觉得太大太绕&#xff0c;最后改为现在的标题。  本篇内容是对用JAVA解析QT&#xff08;用的是QDataSteam&#xff09;所输出&#xff08;序列化&#xff09;的内容的小结。 本文涉及类型包括&#xff1a;QString…...

Docker入门实战---修改Docker镜像源

前言 现在大部分互联网公司在实施项目时几乎都会以微服务架构进行落地&#xff0c;那么微服务一旦多了之后就会面临一个如何友好的治理的问题&#xff0c;本人不会重点介绍治理的问题&#xff0c;而是会简单就治理的其中一个环节服务部署运维的问题进行介绍&#xff0c;服务部…...

Java构建高并发高可用的电商平台(静态架构蓝图之剖析架构)

静态架构蓝图 整个架构是分层的分布式的架构&#xff0c;纵向包括CDN&#xff0c;负载均衡/反向代理&#xff0c;web应用&#xff0c;业务层&#xff0c;基础服务层&#xff0c;数据存储层。水平方向包括对整个平台的配置管理部署和监控。 剖析架构 1. CDN CDN系统能够实时…...

SpringBoot核心运行原理解析之------@Conditional条件注解

在SpringBoot核心运行原理解析之------@EnableAutoConfiguration文档中我们完成了自动配置类的读取和筛选,在这个过程中已经涉及了像@ConditionalOnClass这样的条件注解。打开每个自动配置类,都会看到@Conditional或其衍生的条件注解,本节我们来认识下@Conditional注解。 认…...

systemverilog 001 内建数据类型logic

Verilog 有两种基本数据类型,reg 和wire ,都是4值逻辑 0 1 x z,默认值是x。 reg[7:0] m 为无符号 Integer 为有符号32位 time为64位无符号 real为浮点数 systemverilog新引进了logic,logic既可以作为变量(reg功能),也可以作为线网功能(…...

Flink Kafka-Source

文章目录 Kafka Source1. 使用方法2. Topic / Partition 订阅3. 消息解析4. 起始消费位点5. 有界 / 无界模式6. 其他属性7. 动态分区检查8. 事件时间和水印9. 空闲10. 消费位点提交11. 监控12. 安全 Apache Kafka 连接器 Flink 提供了 Apache Kafka 连接器使用精确一次&#xf…...

VoxelNeXt:用于3D检测和跟踪的纯稀疏体素网络

VoxelNeXt:Fully Sparse VoxelNet for 3D Object Detection and Tracking 目前自动驾驶场景的3D检测框架大多依赖于dense head&#xff0c;而3D点云数据本身是稀疏的&#xff0c;这无疑是一种低效和浪费计算量的做法。我们提出了一种纯稀疏的3D 检测框架 VoxelNeXt。该方法可以…...

必须了解的内存屏障

目录 一&#xff0c;内存屏障1&#xff0c;概念2&#xff0c;内存屏障的效果3&#xff0c;cpu中的内存屏障 二&#xff0c;JVM中提供的四类内存屏障指令三&#xff0c;volatile 特性1&#xff0c;保证内存可见性定义2&#xff0c;禁止指令重排序3&#xff0c;不保证原子性 一&a…...

【设计模式】状态模式

文章目录 前言状态模式1、状态模式介绍1.1 存在问题1.2 解决问题1.3 状态模式结构图 2、具体案例说明状态模式2.1 不使用状态模式2.2 使用状态模式 3、状态模式总结 前言 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示…...

内核驱动支持浮点数运算

最近在调 iio 下的 ICM42686 驱动&#xff0c;因项目求需要在驱动对加速度和陀螺raw数据进行换算&#xff0c;避免不了浮点运算。内核编译时出现了报错&#xff0c;提示如下&#xff1a; drivers/iio/imu/tdk_icm42686/icm42686.o: In function gyro_data2float: /home/share/…...

Flink学习(一)

分布式计算框架 Java可以使用分布式计算来处理大规模的数据和计算任务,提高计算效率和性能。以下是一些Java分布式计算的例子: Apache Hadoop:Hadoop是一个开源的分布式计算框架,可以处理大规模数据集的分布式存储和处理。它使用Java编写,可以在分布式环境中运行MapReduc…...

linux 常用命令awk

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。之所以叫 AWK 是因为其取了三位创始人 Alfred Aho&#xff0c;Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。 AWK用法 awk 用法&#xff1a;awk pattern {action} files 1.RS, ORS, F…...

MySQL学习---15、流程控制、游标

1、流程控制 解决复杂问题不可能是通过一个SQL语句完成&#xff0c;我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序&#xff0c;是我们完成复杂操作必不可少的一部分。只要是执行的程序&#xff0c;流程就分为三大类&#xff1a; 1、顺序结…...

Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux

1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的错误 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…...

如何创造出一种不同于程序语言的人与机器自然交互语言?

人机交互自然语言通过模拟人类日常交流方式&#xff0c;使机器能够理解并响应人类的自然表达&#xff0c;从而打破编程语言的复杂性壁垒&#xff0c;极大地提升人机协同的效率和自然性&#xff0c;让机器更好地融入人类的工作与生活场景。创造一种通用的人与机器自然交互语言是…...

迷宫与陷阱--bfs+回路+剪枝

1.用bfs板子&#xff0c;同时会出现回路&#xff0c;但不能不用bo数组&#xff0c;要减去一部分没有用的回路 2.什么叫没有用的回路--因为我有无敌了&#xff0c;以前遇到的陷阱就能过了&#xff0c;那这就是有用的回路&#xff0c; 所以我记录&#xff08;x,y&#xff09;点…...

hbase资源和数据权限控制

hbase适合大数据量下点查 https://zhuanlan.zhihu.com/p/471133280 HBase支持对User、NameSpace和Table进行请求数和流量配额限制&#xff0c;限制频率可以按sec、min、hour、day 对于请求大小限制示例&#xff08;5K/sec,10M/min等&#xff09;&#xff0c;请求大小限制单位如…...

五子棋网络对战游戏的设计与实现设计与实现【源码+文档】

五子棋网络对战游戏的设计与实现 摘 要 在现代社会中,及其它无线设备越来越多的走进普通老百姓的工作和生活。随着3G技术的普及与应用&#xff0c;基于Java开发的软件在上的使用非常的广泛&#xff0c;增值服务的内容也是越来越多&#xff0c;对丰富人们的生活内容、提供快…...

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片&#xff0c;支持IEC60958、S/PDIF、AES3等协议&#xff0c;集成8选1输入切换、低抖动时钟恢复和24bit DAC&#xff0c;适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度&#xff1a;24bit分辨率&#xff0c;动态范围105dB&…...

2025最新Java日志框架深度解析:Log4j 2 vs Logback性能实测+企业级实战案例

一、为什么printStackTrace是"代码坟场"&#xff1f; 你写的日志可能正在拖垮系统&#xff01; 在Java开发中&#xff0c;直接调用printStackTrace()打印异常堆栈是最常见的"自杀式操作"。这种方式会导致三大致命问题&#xff1a; 无法分级控制&#xff…...

双空间知识蒸馏用于大语言模型

Dual-Space Knowledge Distillation for Large Language Models 发表&#xff1a;EMNLP 2024 机构&#xff1a;Beijing Key Lab of Traffic Data Analysis and Mining 连接&#xff1a;https://aclanthology.org/2024.emnlp-main.1010.pdf 代码&#xff1a;GitHub - songmz…...

Python趣学篇:用Pygame打造绚烂流星雨动画

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《Python星球日记》 目录 一、项目简介与效果展示二、技术栈与核…...

Mac电脑_钥匙串操作选项变灰的情况下如何删除?

Mac电脑_钥匙串操作选项变灰的情况下如何删除&#xff1f; 这时候 可以使用相关的终端命令进行操作。 下面附加文章《Mac电脑_钥匙串操作的终端命令》。 《Mac电脑_钥匙串操作的终端命令》 &#xff08;来源&#xff1a;百度~百度AI 发布时间&#xff1a;2025-06&#xff09;…...