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

一、题目

输入一个整数 n,求从 1 到 n 这 n 个整数的十进制表示中 1 出现的次数。

例如输入 12,从 1 到 12 这些整数中包含 "1" 的数字有 1,10,11 和 12,其中 "1" 一共出现了 5 次。

数据范围

1≤n≤

样例
复制代码
输入: 12
输出: 5

二、思路解析

首先举一个大整数的例子,假设要求1->12098中1的个数:

万位放1,求有多少种情况:1 _ _ _ _ 从千位到个位只能是0000~2098,2099种情况;

千位放1,求有多少种情况:_ 1 _ _ _万位只能为0或1,百位到个位为000-999,2*1000种情况;

百位放1,求有多少种情况:_ _ 1 _ _,当百位放1的时候分为两种情况,第一种为万位和千位为00->11的时候,百位放1数字不大于12098,此时百位放1情况为12*100种情况,但是当万位和千位为12的时候,百位放1不成立。

十位放1,求有多少种情况:_ _ _ 1 _,前面取值000~120,后面取值0~9,有121*10种情况。

同理,个位放1,有0000~1209种情况。

以百位举例,也就是 a b x c d,ab表示数字的万位和千位,0~ab-1的时候,x位为1的情况有ab*100;当万位和千位为ab的时候,需要根据x的值进行判断,当x==0说明该位置在万位和千位为ab的时候不存在1的情况,当x==1需要根据cd的值进行判断,有00~cd种情况,当x>1的时候,说明x=1的时候cd位置可以取00~99,所以有100种情况。

三、代码实现

cpp 复制代码
class Solution {
public:
    int numberOf1Between1AndN_Solution(int n) {
        //当数字为0的时候 1的个数为0 直接返回
        if(!n) return 0;
        int res = 0;
        //存放数字的每一位
        vector<int> number;
        while(n) number.push_back(n % 10),n = n / 10;
        for(int i = number.size() - 1;i >= 0;i --)
        {
            int left = 0,right = 0,t = 1;
            //计算左右两部分的值 t为右部分的位数 
            for(int j = number.size() - 1;j > i;j --) left = left * 10 + number[j];
            for(int j = i - 1;j >= 0;j --) right = right * 10 + number[j], t = t * 10;
            //当左部分没到边界值 比如12011 例如i=2时 说明i位置左边的两个位置可以为00-11 右边的三个位置可以为100-199 100个1 左边*t
            res += left * t;
            //到边界值就要考虑i位置的数字 12011 i = 2的时候 number[i]=0 说明i位置1出现次数为0 number[i] = 1 说明i位置1出现次数取决于right number[i] > 1 说明i位置出现1次数为t次
            if(number[i] > 1) res += t;
            else if(number[i] == 1) res += (right + 1);
            
        }
        return res;
        
    }
};
相关推荐
强盛小灵通专卖员1 小时前
分类分割详细指标说明
人工智能·深度学习·算法·机器学习
IT猿手5 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
万能程序员-传康Kk8 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球8 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788118 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~8 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子8 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
程序媛小盐9 小时前
贪心算法:最小生成树
算法·贪心算法·图论
Panesle9 小时前
分布式异步强化学习框架训练32B大模型:INTELLECT-2
人工智能·分布式·深度学习·算法·大模型
多多*9 小时前
算法竞赛相关 Java 二分模版
java·开发语言·数据结构·数据库·sql·算法·oracle