整数中1出现的次数(从1到n整数中1出现的次数)
描述
求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
代码 (Java)
public class Solution {
public int NumberOf1Between1AndN_Solution(int n) {
if (n <= 0)
return 0;
// 将数字转化为字符数组,方便从高位到低位的遍历
char[] num = String.valueOf(n).toCharArray();
return NumberOf1(num, 0);
}
public int NumberOf1(char[] num, int index) {
if (index == num.length)
return 0;
int first = num[index] - '0'; // 当前最高位的数字
int length = num.length - index; // 当前位到最末的长度
if (length == 1 && first == 0)
return 0;
if (length == 1 && first > 0)
return 1;
int numFirstDigit = 0; // 1在最高位的情况(如111这个数,暂时只计算最高位的一次)
if (first > 1)
numFirstDigit = (int) Math.pow(10, length - 1);
else if (first == 1)
numFirstDigit = Integer.parseInt(String.valueOf(num,index + 1, length - 1)) + 1;
// 1在其他位的情况
int numOtherDigits = first * (length - 1) * (int) Math.pow(10, length - 2);
int numRecursive = NumberOf1(num, index + 1);
return numFirstDigit + numOtherDigits + numRecursive;
}
}
思路
- 时间复杂度O(logn),采用从高到低位递归的计算,重点是找出数字规律。