前言
看了前行者一些大佬以及官方的数学推导方法,人麻了,自己推导了一番没找出来规律,但是,也还能能过,就就非常意外,菜鸡下面可以看看我这个代码简单,思路也简单的解题方法,他们数学推导的时间复杂度能够优化到O(log n),我这个是也能解决问题,但是O(n)的。
思路
要判断1-n中所有的数中1的个数,那就把这些数遍历一遍吧,写个函数isOne计算这个数中1的个数,因为题目最大也就30000所以每次计算最多也就5次,最后把所有的数计算的结果加起来就OK,是不是很简单!
当然,还可以优化一点,比如,每次循环的2-9这部分可以跳过不算。
在20-30,30-40...这些数之间每次必然只有一次1;
在120-130,130-140...这些数之间每次必然只有一次1加上本身自带的10次,也就是11次1;
在1200-1300,1300-1400..这些数之间...
....
当时是这样想的优化,每次转角比如11,111的部分当然也有规律,但是,算法菜鸡得CPU已经麻木了,能O(n)过就没继续弄了也没优化...,如果有大佬能指点一下,欢迎评论优化的方法!
class Solution { public: int NumberOf1Between1AndN_Solution(int n) { int ans=0; for(int i=1;i<=n;i++){ ans+=isOne(i); } return ans; } int isOne(int n){ int ans=0; while(n>0){ if(n%10 ==1) ans++; n=n/10; } return ans; } };