整数中1出现的次数(从1到n整数中1出现的次数)【Java版】
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6
方法一:暴力求解
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int count=0;
for(int i=1;i<=n;i++){//一个一个试
int j=i;
while (j!=0){
if(j%10==1)count++;
j=j/10;
}
}
return count;
}
}
//时间O(NlogN) 空间O(1)
//暴力求解进行了大量的重复计算 方法二:找规律
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int count =0;
for(int i=1; i<=n; i*=10){//i每次*10,而不是+1 //复杂度O(logN) //i=1、10、100...分别对应个位、十位、百位的"1" //包含n(因为每一轮都代表一个数字位,例如10包含个位和十位)
int a = n/(i*10);//当前位之前的数
int b = n%i;//当前位之后的数
int c = (n/i)%10;//当前位
//整批
count += a*i;
//末尾零散
if(c==1) count += (b+1);
else if(c>=2) count += i;
}
return count;
}
}//时间O(logN) 空间O(1)
//ps:网上方法,将count+=语句压缩到一行,会严重影响可读性 《剑指Offer-Java题解》 文章被收录于专栏
《剑指Offer-Java题解》