整数中1出现的次数(从1到n整数中1出现的次数)
整数中1出现的次数(从1到n整数中1出现的次数)
http://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6
这道题思路很简单,就是处理情况的时候容易出错。
思路:
求每位出现1的次数,然后相加即可。
现在问题变成如何求每一位出现1的次数。
以23145为例
定三个变量:
假如当前求的是十位上1出现的次数,那么:
高位:231
低位:5
当前值:4
我们只需要想当前值为1的时候,高位和低位有多少选择。
因为当前值4>1,所以高位可取0~231,低位可取0~9.
所以十位上1出现的次数就是232*10;
特殊情况就是当前位是1的时候,
这时候当高位取最大值的时候,低位只能取0~低位最大值。
高位取其他值的时候,按上面的计算就行。
以上面的百位为例:
高位:23
当前:1
低位:45
百位出现1的次数=23*100+(45+1)
当当前位为0的时候,最高位可取0~(最高位-1),低位可取0~(当前求的位数值-1),相乘即可。
代码:
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
int count=0;
int high;
int low;
int prelow=0;
for(int i=1;i<=n;i=i*10){//i记录当前是多少位
high=n/(i*10);
low=n%(i*10)/i;
if(i>=10){//当前位非个位的时候才有低位
prelow=n%i;
}
if(i==1){//当前位为个位的时候
if(low>=1){
count=high+1;
}else{
count=high;
}
}else{
if(low==1){
count=count+high*i+prelow+1;
}else if(low>1){
count=count+(high+1)*i;
}
else{
count=count+high*i;
}
}
}
return count;
}
}
查看10道真题和解析
字节跳动公司福利 1328人发布