博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer——面试题32:从1到n整数中1出现的次数
阅读量:4088 次
发布时间:2019-05-25

本文共 1365 字,大约阅读时间需要 4 分钟。

int NumberOf1Between1AndN_Solution1(unsigned int n){    int number = 0;    for(unsigned int i = 1; i <= n; ++ i)        number += NumberOf1(i);    return number;}int NumberOf1(unsigned int n){    int number = 0;    while(n)    {        if(n % 10 == 1)            number ++;        n = n / 10;    }    return number;}

int NumberOf1Between1AndN_Solution2(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
(strlen(strN)); if(length == 1 && first == 0) return 0; if(length == 1 && first > 0) return 1; // 假设strN是"21345" // numFirstDigit是数字10000-19999的第一个位中1的数目 int numFirstDigit = 0; if(first > 1) numFirstDigit = PowerBase10(length - 1); else if(first == 1) numFirstDigit = atoi(strN + 1) + 1; // numOtherDigits是01346-21345除了第一位之外的数位中1的数目 int numOtherDigits = first * (length - 1) * PowerBase10(length - 2); // numRecursive是1-1345中1的数目 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;}

你可能感兴趣的文章
烈焰SWF解密
查看>>
Qt 静态编译后的exe太大, 可以这样压缩.
查看>>
3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇
查看>>
乘法逆元
查看>>
STL源码分析----神奇的 list 的 sort 算法实现
查看>>
Linux下用math.h头文件
查看>>
Linux中用st_mode判断文件类型
查看>>
Ubuntu修改host遇到unable to resolve host
查看>>
路由选择算法
查看>>
Objective-C 基础入门(一)
查看>>
Objective-C 基础入门(三) 读写文件与回调
查看>>
C++ STL标准库与泛型编程(一)概述
查看>>
C++ STL标准库与泛型编程(四)Deque、Queue、Stack 深度探索
查看>>
C++ STL标准库 算法
查看>>
JVM内存模型_Minor GC笔记
查看>>
SpringCloud学习之PassCloud——(一)PassCloud源代码下载
查看>>
Linux下安装Python环境并部署NLP项目
查看>>
Nginx篇-springCloud配置Gateway+Nginx进行反向代理和负载均衡
查看>>
Nginx篇-Nginx配置动静分离
查看>>
缓存篇-Redis缓存失效以及解决方案
查看>>