很有意思的一道题,找到数学规律,从个位数一直找到最高位
比如输入13,那么在个位数上会有 13 / 10 乘以 1 个 1, 这个只是算了10之前的个位数上的1,同时还要加上10到13这一段个位数上的1,这里因为3大于1,所以加以,如果3是小于1的则不加那个一。
同理,推导到十位数,13/100为 0 个0, 然后我们判断从000 到 013这一段十位数上有多少个1, 因为13 是大于 10, 但是小于20的, 所以我们要加上 13 - 10 + 1个1
注意不要超限,题目既然都说了,那么最好可能超限的变量都用long好了
代码如下
public class Solution { public int countDigitOne(int n) { long tmp = 10; long result = 0; long N = n; while (tmp <= N * 10) { result += (N / tmp) * (tmp / 10); if (N % tmp >= 2 * tmp / 10) { result += tmp / 10; } else if (N % tmp >= tmp / 10) { result += n % tmp - tmp / 10 + 1; } tmp *= 10; } return (int)result; } }