031整数中1出现的次数
求出从1到n的所有数中,1出现的次数(11算两次,111算三次)
方法一:暴力字符串求解
方法:把它所有数用StringBuffer记下来,然后转成String字符串然后遍历进行判断
代码:
public int NumberOf1Between1AndN_Solution(int n) {
if(n<=0) return 0;
StringBuffer sb = new StringBuffer();
for (int i = 1; i <=n ; i++) {
sb.append(i);
}
String str = sb.toString();
int count = 0;
for (int i = 0; i <str.length(); i++) {
if(str.charAt(i)=='1') count++;
}
return count;
}
方法二:找规律法
通过输入数的位数对个位十位百位等可以进行归纳法,能得到一个相同的规律
k = n % (i * 10)
count(i) = (n / (i * 10)) * i + (if(k > i * 2 - 1) i else if(k < i) 0 else k - i + 1)
ps:i表示位数,后面的if判断要多注意
代码:
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if(n <= 0)
return 0;
int count = 0;
for(long i = 1; i <= n; i *= 10){
long diviver = i * 10;
count += (n / diviver) * i + Math.min(Math.max(n % diviver - i + 1, 0), i);
}
return count;
}
}