剑指offer(16)-从1到n整数中1出现的次数
2016-12-21 17:40
260 查看
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。
这道题目解法非常多,非常直观的解法是:
时间效率并不高,有很多非常高效的解法。
《编程之美》中运用找规律的方法,找到每一位为0,1或其它数时的1的计数规律,详细解释见相关章节,非常高效。
这道题目解法非常多,非常直观的解法是:
class Solution { public: int NumberOf1Between1AndN_Solution(int n) { int number = 0; for (int i = 0;i <= n;i++) number += NumbersOf1(i); return number; } int NumbersOf1(int n) { int numbers = 0; while (n) { if (n % 10 == 1) ++numbers; n = n / 10; } return numbers; } };
时间效率并不高,有很多非常高效的解法。
《编程之美》中运用找规律的方法,找到每一位为0,1或其它数时的1的计数规律,详细解释见相关章节,非常高效。
class Solution { public: int NumberOf1Between1AndN_Solution(int n) { int iCount = 0; int iFactor = 1; int iLowerNum = 0; int iCurrentNum = 0; int iHigherNum = 0; while (n / iFactor != 0) { iLowerNum = n - (n / iFactor) * iFactor; iCurrentNum = (n / iFactor) % 10; iHigherNum = n / (iFactor * 10); switch(iCurrentNum) { case 0: iCount += iHigherNum * iFactor; break; case 1: iCount += iHigherNum * iFactor + iLowerNum + 1; break; default: iCount += (iHigherNum + 1) * iFactor; break; } iFactor *= 10; } return iCount; } };
相关文章推荐
- 《剑指offer》-整数中1出现的次数
- 剑指offer——整数中1出现的次数(从1到n整数中出现1的次数)可优化
- 剑指offer系列之三十:整数中1出现的次数
- 从1到n整数中1出现的次数——剑指offer面试题32
- 剑指offer——面试题32:从1到n整数中1出现的次数
- 剑指offer(33):从1到n整数中1出现的次数
- 剑指offer-整数中1出现的次数
- 剑指offer——面试题32:从1到n整数中1出现的次数
- 剑指offer-面试题32.从1到n整数中1出现的次数
- 剑指Offer系列-面试题32:从1到n整数中1出现的次数
- 剑指offer-整数中1出现的次数
- 剑指offer(四十)之整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指offer(31)—整数1出现的次数
- 《剑指offer》刷题笔记(时间效率):整数中1出现的次数
- 剑指offer第三十一题【整数中1出现的次数(从1到n整数中1出现的次数)】c++实现
- 《剑指offer》:[32]从1到n整数中1出现的次数
- 剑指offer——整数中1出现的次数
- 《剑指Offer》学习笔记--面试题32:从1到n整数中1出现的次数
- 《剑指offer》——整数中1出现的次数(从1到n整数中1出现的次数)
- 剑指Offer(java版):从1到n整数中1出现的次数