面试题32:在从1到n的正数中1出现的次数

1、方法一:

class Solution1 {
public:
    int NumberOf1OfN(int n)
    {
        int cnt=0;
        while(n!=0){
            if(n%10==1){
                cnt++;
            }
            n=n/10;
        }
        return cnt;
    }


    int NumberOf1Between1AndN_Solution(int n)
    {
        int cnt=0;
        for(int i=1;i<=n;i++){
            cnt+=NumberOf1OfN(i);
        }
        return cnt;
    }
};

2、方法二
使用递归的思路

class Solution2 {
public:
    int numberof1(char* strN)
    {
        int first_digit=*strN-'0';
        int len=strlen(strN);
        if(len==1 && 0==first_digit){
            return 0;
        }else if(1==len && first_digit>0){
            return 1;
        }

        int num_recursive=numberof1(strN+1);
        int num_other=first_digit*(len-1)*pow(10,len-2); 
         //乘以first_digit是因为,以2为例,可以取值0和2,是两个;以3为例,可以取值0,2,3,是三个;
        //1出现在第一位之外的其他位,其余的位数字在0到9这10个数字任意选择,由排列组合可以得出总次数

        int num_first_digit=0;
        if(first_digit>1){
            num_first_digit=pow(10,len-1);

        }else if(first_digit==1){
            num_first_digit=atoi(strN+1)+1;
        }

        return num_first_digit+num_other+num_recursive;

    }

    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n<=0){
            return 0;
        }

        char strN[32];
        sprintf_s(strN,"%d",n);
        return numberof1(strN);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值