// 面试题43:从1到n整数中1出现的次数
// 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如
// 输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。

#include <iostream>
#include <cstring>
#include <cstdlib>// ====================方法一====================
//逐个判断,时间复杂度为O(nlogn),不好
int NumberOf1(unsigned int n);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 NumberOf1(const char* strN);
int PowerBase10(unsigned int n);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<unsigned int>(strlen(strN));//强制转换符if (length == 1 && first == 0)//边界特殊情况return 0;if (length == 1 && first > 0)return 1;// 假设strN是"21345"//先计算第一种情况,第一位为1的个数// numFirstDigit是数字10000-19999的第一个位中1的数目int numFirstDigit = 0;if (first > 1)numFirstDigit = PowerBase10(length - 1);else if (first == 1)numFirstDigit = atoi(strN + 1) + 1;//若在1xx的情况,个数不到PowerBase10(length - 1),atoi是字符串转整数//第二种情况,非第一位为1的个数// numOtherDigits是01346-21345除了第一位之外的数位中1的数目int numOtherDigits = first * (length - 1) * PowerBase10(length - 2);//第一位可能性有first个,第二项表示选取除了第一位的任一位为1,剩下的有10种可能// numRecursive是1-1345中1的数目,使用迭代处理int numRecursive = NumberOf1(strN + 1);return numFirstDigit + numOtherDigits + numRecursive;
}int PowerBase10(unsigned int n)//10的n次方
{int result = 1;for (unsigned int i = 0; i < n; ++i)result *= 10;return result;
}// ====================测试代码====================
void Test(const char* testName, int n, int expected)
{if (testName != nullptr)printf("%s begins: \n", testName);if (NumberOf1Between1AndN_Solution1(n) == expected)printf("Solution1 passed.\n");elseprintf("Solution1 failed.\n");if (NumberOf1Between1AndN_Solution2(n) == expected)printf("Solution2 passed.\n");elseprintf("Solution2 failed.\n");printf("\n");
}void Test()
{Test("Test1", 1, 1);Test("Test2", 5, 1);Test("Test3", 10, 2);Test("Test4", 55, 16);Test("Test5", 99, 20);Test("Test6", 10000, 4001);Test("Test7", 21345, 18821);Test("Test8", 0, 0);
}int main(int argc, char* argv[])
{Test();system("pause");return 0;
}

转载于:https://www.cnblogs.com/CJT-blog/p/10522116.html

《剑指offer》第四十三题(从1到n整数中1出现的次数)相关推荐

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

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

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

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

  3. 【剑指offer】面试题43:1~n整数中1出现的次数

    输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次. 示例 1: 输入:n = 12 输出:5 ...

  4. 剑指Offer(第二版)面试题56:数组中数字出现的次数

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73609133冷血之心的博客) 剑指Offer(第二版)面试题56: ...

  5. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...

  6. 牛客网(剑指offer) 第十三题 调整数组顺序使奇数位于偶数前面

    //题目描述 //输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数, //偶数和偶数之间的相对位置不变. & ...

  7. 【剑指offer-Java版】32从1到n的整数中1出现的次数

    1到n中1出现的次数: 书上的讲解实在是没看懂,翻翻作者的博客找到了一个通俗解法,自己又补充了一些思考细节,全在注释里面了 public class _Q32<T> {public sta ...

  8. 牛客网剑指offer编程实践1-10题

    牛客网剑指offer编程实践1-10题 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这 ...

  9. 【剑指Offer】俯视50题之31 - 40题

    [剑指Offer]俯视50题之31 - 40题 面试题31连续子数组的最大和 面试题32从1到n整数中1出现的次数 面试题33把数组排成最小的数 面试题34丑数 面试题35第一个仅仅出现一次的字符 面 ...

  10. 《剑指 Offer I》刷题笔记 51 ~ 61 题

    <剑指 Offer I>刷题笔记 51_60 位运算(简单) 51. 二进制中 1 的个数 _解法1:逐伟判断 解法2:巧用 n&(n-1) 52. 不用加减乘除做加法(背题) 解 ...

最新文章

  1. MySQL 备份和恢复策略
  2. JAVA数字处理类使用2
  3. VM虚拟机运行Windows11出现蓝屏
  4. 如何让电脑成为看图说话的高手?计算机视觉顶会ICCV论文解读
  5. 听云CTO访谈:解读现代应用性能管理(APM)技术
  6. 解决mysql无法启动,错误1067
  7. AI框架中图层IR的分析
  8. 芯片业巨震!英特尔拟90亿美元卖掉NAND闪存业务
  9. vector 插入_Java学习五分钟系列:对比Vector、ArrayList、LinkedList
  10. 一个AI玩57个游戏,DeepMind离真正「万能」的AGI不远了!
  11. [轉]winrar的命令行
  12. 设计模式之创建型(1)-简单工厂
  13. 计算出 3 至 1000 范围内最大的十个素数,放入数组中,并计算出其累加和。
  14. android常用的存储方式,Android数据的四种存储方式
  15. mschart控件_使用MSChart控件绘制图表。
  16. 中国智慧停车行业未来前景展望及项目运营规模咨询报告2021-2027年
  17. 软件运维工程师岗位职责和要求
  18. java根号n元素的合并排序算法_根号N段合并排序
  19. SSM框架整合—CRM小案例
  20. 百度K站的神奇简单有效的方法

热门文章

  1. Perform the Combo CodeForces - 1311C(字符串反转+树状数组)
  2. 集训队脱单大法:这是一道只能由学姐我自己出数据的水题(牛客竞赛)
  3. 计算机通信技术用到的文献,计算机技术在通信中的应用与发展
  4. pcs7更改项目计算机名时出错,PCS7 C/S报警问题-工业支持中心-西门子中国
  5. 运放电路分析_运放参数的详细解释和分析part4运放噪声
  6. activemq 延时队列以及不生效问题
  7. mapreduce简单的gzip压缩
  8. OC(Open collector) 集电极开路
  9. 标准10进制公制度量系统中 倍率关系 大全
  10. LLVM4更新--简化对象定义