【编程之美】读书笔记:求1到N之间整数中出现1的个数

编程之美读书笔记(3) 统计在从1到n的正整数中1出现的次数 问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1的个数是5。 问题一: 写一个函数f(N),返回1到N之间出现1的个数,比如f(12)= 5。 解法一: 让我们首先想到 阅读详情

        问题:给定一个十进制正整数N,写下从1开始到N的所有整数,求其中出现的所有“1”的个数?例如:N=2,写下1,2.1的个数为1。当N=12,1的个数为5。

       解法一:从1开始遍历到N,将其中每一个数中含有1的个数加起来,得到从1到N的所有1的个数之和。
  

 int Count1InInteger(int n)
{
   int iNum=0;
   while(n!=0)
  {
   iNum+=(n%10==1)?1:0;
   n/=10;
}
return iNum;
}

int f(int n)
{
int iCount=0;
for(int i=1;i<=n;i++)
{
iCount+=Count1InInteger(i)
}
return iCount;
}


        这个算法的时间复杂度为:O(N)*计算每个整数里面“1”的个数的复杂度=O(N*logN);当N非常大的时候,该时间复杂度以超过线性的速度增长。


           解法二:假设N=abcde,这里a,b,c,d,e分别是十进制数N的各个位数上的数字。如果要计算百位上出现1的次数,它会受到三个因素影响:百位数上的数字,百位以下的数字,百位以上的数字。

          a、如果百位上的数字为0,则百位出现1的次数由更高位决定。如12013,则可以知道百位出现1的情况可能是100~199,1100~1199,2100~2199,。。,11100~11199,一共1200个。也就是由更高位数字(12)决定,并且等于更高位数字(12)*当前位数(100);
         b、如果百位上数字为1,则百位上出现1的次数由更高位和低位共同决定。例如对于12113,受高位的影响百位出现1的个数为等于更高位数字(12)*当前位数(100)=1200.但是它还受低位影响,等于低位数
字(113)+1;
        c、如果百位上的数字大于1(即为2-9),则百位出现1的次数仅由更高位决定,比如12213,等于更高位数字+1(12+1)*当前位数(100)=1300.

 通过分析,得出如下代码:

 int Sum1s(int n)
{
int iFactor=1;
int iLowerNum=0;
int iCurrNum=0;
int iHigherNum=0;
while(n/iFactor!=0)
{
iLowerNum=n-(n/iFactor)*iFactor;
iCurrNum=(n/iFactor)%10;
iHigherNum=n/(iFactor*10);
switch(iCurrNum)
{
case 0:
iCount+=iHigherNum*iFactor;
break;
case 1:
iCount+=iHigherNum*iFactor+iLowerNum+1;
break;
default:
  iCount+=(iHigherNum+1)*iFactor;
break;
}
iFactor*=10;
}
return iCount;
}


该算法的时间复杂度为O(Len),Len为数字N的长度。

《编程之美》——读书笔记 最近花了几天时间把《编程之美》这本书好好读了一遍,感觉收获还是挺大的。 于是决定做个笔记,算是简单的摘录一些书中的精彩思想,也算重新回顾思考下   1.5 快速找出机器故障 问题描述: 有很多的ID(可能位数很大),其中只有一个ID出现的次数小于2,其他正常ID出现的次数都等于2,求这个次数为1的ID 精彩解法: 将所有的数从头到尾异或一遍,这样得出来的最终结果就是所求的答案。 拓 阅读详情

相关推荐

(C语言)输入n,统计0~n中1的个数。

输入数字n,统计0~n中1的个数,如12,1,10,11,12带1的个数5个。(假定输入的数0~999)(数组法)

【算法】从1到n中1出现的个数

缘由 买了两本算法方面的书,每次都是随便翻一翻,前两天睡前随便翻了下,看到这道题觉得很有意思,反复看了好几次看完全明白过来,然后今天趁周末没事在leetcode上面找到这道题自己写了写,特意记录下来。 1. 解法1 首先按照最自然的的思路就是从1到n求每个数字中1出现的个数,无非就是一个循环,然后通过while取模算每个数字的个位数字是否是1 if(n<1) return 0 int co...

tian2342的专栏 2410

统计1到n之间所有含1的数字个数,并找出n以内最大的那个f(m)=m的值

统计1到n之间所有含1的数字个数f(n),并找出n以内最大的那个f(m)=m的值,f(n)的时间复杂度为O(logn),找最大的那个f(m)=m的值的时间复杂度为O(n)。 思路和一位叫深海蓝天的哥们一样,不过那哥们提供的程序当n=2500000000时,f(n)计算的结果有错。网上很多程序都没考虑到n接近unsigned long能表达的最大值时,计算f(n)会发生溢出,所给的程序考虑了这点,计算结果与最直接的解法: for(n:N) { 判断n包含1的个数; 累加计数器; } 完全一致

计算从 1 -n 中1出现的次数

1. 个位出现1的个数为 1 2. 十位出现1的个数为10 3. 百位出现1的个数为100 综上所述 每个位出现 一个数的次数为 10^(i-1) 设置 当前数位上的数 为tmp 设置 出现数位 n tmp<n 则受高位上的数的影响 高位数*10^(i-1) tmp>n 则受高位上的数与低位数的影响 高位数*10^(i-1)+10^(i-1) tmp=n 则受高位上的数与低位数的影响 相对来说复杂一点 ,需要计算后面影响的数 高位数*10^(i-1)+ 低位数 + 1 代码如下:...

wt5264的博客 576

利用树莓派制作智能音箱

利用树莓派制作智能音箱

qq_61803022的博客 1776

JS逆向-快手__NS_hxfalcon参数分析

现在快手H5接口都需要__NS_hxfalcon这个参数,这篇文章就是逆向这个参数

ckcookies的博客 4073

从1到N整数中1出现的次数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。https://leetcode-cn.com/problems/number-of-digit-one/ 示例: 输入: 13 输出: 6 解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。 能想到最直观的方法(说实话 ,我没想到 , 第一眼我认为这是一个数学题, 根本没有想到用计算机的思路解决问题), 也就是累加1到n中每个整数1出现的次数。我们可以每次通过对10求余数判断整数的个位数字是...

gcs的博客 4993

卫星图像检测,分割,跟踪,超分辨率,数据集调研,以及论文笔记

目标检测,针对物体有很多类如桥,烟囱,罐子等,有静态图像下的检测,也就是图像源头多来自谷歌地图,但是前后帧没有任何联系,并且谷歌地图相对来说比较清楚,难度小一点,也有粗粒度以及较细粒度的检测,然后卫星视频的数据集较少,则可以通过前后帧的联系来辅助检测,并且卫星帧基本上只对车,船,飞机,火车进行检测,没有进行细粒度的检测即将车辆分类为卡车,皮卡,小轿车,但是关船,则可以分类为货船以及军舰,因为目前的卫星视频中小车实在太少了,难以进行更细粒度的检测。luojia 三号卫星。

zhangzhao147的博客 4706

整数中1的个数

1、题目 求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数) 2、解题1: class Solution { public: int NumberOf1Between1AndN_Solution(int n) { int count = 0; for(int i = 1;i<=n;i++){ count += FindNum(i); } return count; }

weixin_42282999的博客 395

离散小波-DWT

前沿:      小波变换比较复杂,而且内容

tianchang2you的专栏 4647

超声波传感器(CH101&ch201) - Ⅰ

压电微机械超声换能器(PMUT)和超声波信号处理的可编程片上系统(SoC)集成在一起的传感器

nicole088的专栏 2796

[读书笔记]编程之美(二)

[读书笔记]编程之美(二)2.1求二进制数中1的个数 问题:对于一个字节(8bit)的无符号整形变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。 思路: n = n & (n-1);当然因为只有8bit所以直接定义一个256的int数组表,直接返回结果,时间复杂度是O(1)。2.2不要被阶乘吓到 问题:1.给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=362

xy_cpp的博客 569

DOTS 性能基石:为什么传统 Unity 代码难以满足现代游戏需求?(DOTS 系列教程 · 第1篇)

本文探讨了Unity游戏开发中的性能优化问题,指出性能问题不应在最后才考虑,而应贯穿整个开发过程。文章分析了性能问题的三大表现(渲染开销、物理模拟、游戏逻辑),并解释了依赖硬件升级的不可行性。重点剖析了传统Unity代码性能低下的六大根源:垃圾回收卡顿、编译器优化不足、多核利用不足、数据结构和代码缓存不友好、过度抽象等问题。最后指出Unity项目中常见的反模式,如主线程垄断、内存碎片化等,为后续学习DOTS高性能架构解决方案奠定基础。

分享知识,拥抱变化 150

编程之美读书笔记 汇总

(1)编程之美读书笔记(1)二进制数中1的个数 (2)编程之美读书笔记(2)大数问题(高精度运算) (3)编程之美读书笔记(3) 统计在从1到n的正整数中1出现的次数 (4)编程之美读书笔记(4)寻找最大的K个数 (5)编程之美读书笔记(5)最大公约数

落日小屋 1974

2025国赛数学建模A题 完整Python代码 烟幕干扰弹的投放策略

常量定义G = 9.8 # 重力加速度 m/s²V_SMOKE_SINK = 3 # 烟幕下沉速度 m/sMISSILE_SPEED = 300 # 导弹速度 m/sEFFECTIVE_RADIUS = 10 # 有效遮蔽半径 mEFFECTIVE_DURATION = 20 # 有效遮蔽时间 sTARGET_POS = np.array([0, 200, 0]) # 目标位置FALSE_TARGET_POS = np.array([0, 0, 0]) # 假目标位置# 初始位置。

YOLO 1106

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

编程之美读书笔记---统计在从1到n的正整数中1出现的次数

问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1的个数是5。 问题一: 写一个函数f(N),返回1到N之间出现1的个数,比如f(12)= 5。 解法一

Arcsinsin的学习笔记 1217

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【编程之美】读书笔记:给定一个整数N,求N!末尾有多少个0

问题:给定一个整数N,求N!末尾有多少个0          这个题目不能直接求出N!的值,这样可能会溢出。首先考虑N!=K*10^M,并且K不能被10整除,那么N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于10=2*5,所以M只和X和Z有关,每一对2和5相乘都可以得到一个10,于是M=min(X,Z);不能看出X>=Z.所以把公式简化为M=Z

xiaoding133的专栏【Stay hungry,Stay foolish】 4225

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

《编程之美》读书笔记21: 2.4 1的数目

<br />《编程之美》读书笔记21: 2.4 1的数目<br /> <br />问题:<br />    给定一个十进制正整数N,写下从1开始,到N的所有整数,<br />    然后数一下其中出现的所有“1”的个数。<br />    例如:<br />      N=2,写下 1,2。这样只出现了 1 个“1”。<br />N=12,我们会写下 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样 1 的个数是 5。<br /> <br />    1. 写一个函数f(N)

flyinghearts的专栏 948

编程之美 读书笔记(寻找最大的k个数)

实际的情况我觉得往往要考虑到数的范围,数的特点(整数还是浮点,重复多不多)以及K与数组长度N的比例关系,数组长度N是否超出内存大小等等因素。 问题:有很多无序的数,姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 实际可能的应用场景 1从1亿个qq号码中选出最值钱的5000个 2从2亿张图片中选出点击率最高的100张 算法一: 直接选择排序、冒泡排序 时间复杂度: o(N^2)

xdgs_2005的专栏 478

编程之美读书笔记_2.5 寻找最大的K个数

2.5 寻找最大的K个数从n个数中寻找最大的k个数,两种思路:1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_heap方便手动构建堆结构。(测试发

flyinghearts的专栏 2731

编程之美读书笔记之寻找1的个数

题目: 看到这个,第一反应肯定是利用除法的特性.对余数进行判断. 例如 00010010  第一次除以2,余数为0,商为00001001 第二次除以2,余数为1,商为00000100 以此类推,于是就有了解法1 解法1 int Count1(unsigned int v)//解法1 时间复杂度为o(log2(N)) { int sum = 0; while(

一介渔夫 1746
上一篇: 【编程之美】读书笔记:寻找发帖水王
下一篇: 【排序算法】堆排序
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值