LeetCode:求数字1出现的个数

题目:给定一个整数 n,计算所有<= n 的非负整数中数字 1 出现的个数。

示例:

输入: 13
输出: 6 
解释: 数字 1 出现在以下数字中: 1, 10, 11, 12, 13 。

法1、位数法 

#直接了当的当做一个数字参与运算,一个位数一个位数(个十百千万)的提取-->判断

class Solution:
    def countDigitOne(self, n: 'int') -> 'int':
        count=0
        for i in range(1,n+1):
            #print(i)
            while i:
                if i%10==1:
                    count+=1
                    # print('i=',i)
                    # print('count=',count)
                    #break
                i//=10
        return count

s=Solution()
s.countDigitOne(13)

输出内容: 

法2、字符法

#把输入的int数字当做一个string字符串类型,要判断的数字1也当做string类型“1”;这样就是判断每一个字符是否一样

class Solution:
    def countDigitOne(self, n: 'int') -> 'int':
        total= 0 
        for i in range(1,n+1):
            total+=list(str(i)).count('1')
        return total
s = Solution()
s.countDigitOne(13)

:看到有人在争论,不小心看成了“给定一个整数 n,计算所有小于等于 n 的非负整数中含有数字 1 出现的数的个数。”

然后就成了1, 10, 11, 12, 13 ,5个数字,答案为5;不一样的地方就是一个对数字中所有位数的数字都检查下,另一个是只要检查到有1存在,就+1不再检查了,break跳出。如下所示:

class Solution:
    def countDigitOne(self, n: 'int') -> 'int':
        count=0
        for i in range(1,n+1):
            #print(i)
            while i:
                if i%10==1:
                    count+=1
                    # print('i=',i)
                    # print('count=',count)
                    break    # 发现有1,就跳出循环
                i//=10
        return count

s=Solution()
s.countDigitOne(13)

输出内容: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱多多先森

你的鼓励,是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值