面试题43:1~n整数中1出现的次数

这篇博客探讨了如何计算从1到n的所有整数中数字1出现的总数。通过分析数字的每一位,可以利用找规律、排列组合的方法来递归计算1的出现次数。代码实现中,定义了一个名为`dealnum`的函数,根据数字的每一位进行计算,并结合`countDigitOne`函数处理整个问题。
摘要由CSDN通过智能技术生成

面试题43:1~n整数中1出现的次数

题目

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

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

考点

找规律

先考虑最高位,最高位分为是否大于1考虑最高位1出现次数

再考虑除最高位剩下几位中1出现的次数,此时计算1出现的次数采用排列组合的方式

再递归考虑除最高位剩下的尾数部分

LeetCode版本

class Solution {
public:
    int dealnum(const char *num){
        if(num == nullptr)return 0l
        int len = strlen(num);
        int first = *num - '0';
        if(len == 0) return 0;
        if(len == 1 && first >= 1) return 1;
        if(len == 1 && first == 0) return 0; //要考虑数字为0的情况
        int hightestnum(0),othernum(0),tailnum(0);
        if(first == 1) hightestnum = atoi(num+1) + 1;
        if(first > 1) hightestnum = pow(10,len-1);
        othernum = firtst * (len-1)*pow(10,len-2);
        tailnum = dealnum(num+1);
        return hightestnum + othernum + tailnum;


    }
    int countDigitOne(int n) {
        char num[50];
        snprintf(num,sizeof(num)-1,"%d",n);
        return dealnum(num);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值