剑指offer | # 整数中1出现的次数(从1到n整数中1出现的次数)

本文详细解析了一种高效算法,用于计算非负整数区间内数字1的出现次数,通过递归方式从高位到低位遍历,实现O(logn)的时间复杂度,适用于大范围数值计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

描述

求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

代码 (Java)
public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        if (n <= 0)
            return 0;
        // 将数字转化为字符数组,方便从高位到低位的遍历
        char[] num = String.valueOf(n).toCharArray();
        return NumberOf1(num, 0);
    }

    public int NumberOf1(char[] num, int index) {
        if (index == num.length)
            return 0;

        int first = num[index] - '0';   // 当前最高位的数字
        int length = num.length - index;    // 当前位到最末的长度

        if (length == 1 && first == 0)
            return 0;
        if (length == 1 && first > 0)
            return 1;

        int numFirstDigit = 0;      // 1在最高位的情况(如111这个数,暂时只计算最高位的一次)
        if (first > 1)
            numFirstDigit = (int) Math.pow(10, length - 1);
        else if (first == 1)
            numFirstDigit = Integer.parseInt(String.valueOf(num,index + 1, length - 1)) + 1;

        // 1在其他位的情况
        int numOtherDigits = first * (length - 1) * (int) Math.pow(10, length - 2);

        int numRecursive = NumberOf1(num, index + 1);
        return numFirstDigit + numOtherDigits + numRecursive;
    }
}
思路
  • 时间复杂度O(logn),采用从高到低位递归的计算,重点是找出数字规律。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值