n范围数字内数字1的个数

原题在这里

  概述题意:求n范围内的数字中,数字1的个数。

analyse:

  我起初做这个题的时候,也是考虑的从每一位数字上去分析这个位能给ans提供多少个1,但终究是太nen了,想得稀奇古怪,不过最后还是瞎捣鼓4小时以后还是ac了,虽然写得很混乱,人也没忍住我老是写错我想要的逻辑,写完连题解都不想看了,搁置了许多天。

分析学习在这里

 

那是该想到的都想到了,就是实现的逻辑不同,人家纯纯数学带佬,我就不一样,瞎鼓捣,要不是有力扣可以无限提供样例,我多半不会写出来。

但是着实没办法(无能狂怒

 

由于我的code非常乱,所以:

复制代码
class Solution
{
    string s;
    int l, len;
    int dfs(int x)
    {
        string p = s.substr(0, l - x);
        string q = s.substr(l - x + 1, x);
        int u = atoi(p.c_str()), v = atoi(q.c_str());
        int sum = 0, tp = -1;
        if (x != 0 && x != l)
        {
            tp = u + (s[l - x] > '1');
            sum += pow(10, x) * tp + (s[l - x] == '1' ? v + 1 : 0);
        }
        else
        {
            sum += u;
            if (l - x == 0)
                sum += s[l - x] > '1' ? pow(10, x) : v + 1;
            else
                sum += s[l - x] >= '1';
        }

        if (x < l)
            return dfs(x + 1) + sum;
        else
            return sum;
    }

public:
    int countDigitOne(int n)
    {
        s = to_string(n);
        l = s.length() - 1;
        if (!n)
            return 0;
        len = log10(n);
        return dfs(0);
    }
};
不建议看
复制代码

 

一通分析下来的数学代码(int会被卡一下,所以得用long):

复制代码
class Solution
{
public:
    int countDigitOne(int n)
    {
        int ans = 0;
        long i = 1, m = n;
        while (i <= m)
        {
            ans += (m / (i * 10)) * i + min(max(m % (i * 10) - i + 1, (long)0), i);
            i *= 10;
        }
        return ans;
    }
};
复制代码

 

【Over】

posted @   Renhr  阅读(56)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示