JZ31 1~n整数中出现的次数
题目描述
求出1~ 13的整数中1出现的次数,并算出100~ 1300的整数中1出现的次数?为此他特别数了一下1~ 13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
思路
两种比较容易想到的方法(虽然我自己是没想到)
方法1
用to_string函数将整数化为字符串,然后数每个字符串中‘1’的个数
但是比较耗时
代码:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int count = 0;
string str;
for (int i = 1; i < n + 1; i++)
{
str = to_string(i);
for (int j = 0; j < str.size(); j++)
{
if (str[j] == '1')
{
count++;
}
}
}
return count;
}
};方法2
还是从1到n,对于每一个数来说,数他1的个数,相当于先%10看是否等于1,然后再/10;继续%10看是否等于1
这种方式还是需要对每一个数进行处理
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
if(n<=0)
return 0;
int count=0;
for(int i=0;i<=n;i++)
{
int temp=i; //我一开始没加这一句,那不是傻了么,i一直在变了,还怎么结束啊
while(temp)
{
if(temp%10==1)
count++;
temp/=10;
}
}
return count;
}
};方法三
书上的方法,对于数去找规律,用递归进行求解;上面两种方法可能在数值比较小的时候看不出劣势,但是如果数值很大的话一个一个的处理会非常耗时,所以之后可以看下书上这道题的思路
