您的位置:首页 > 职场人生

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

2016-05-04 22:05 399 查看
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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: