差别仅在最高位 1 的个数,合并处理两种情况。 */ classSolution { public: intNumberOf1Between1AndN_Solution(int n){ if (n <= 0) return0; if (n < 10) return1; if (n == 10) return2;
int pow = 1, high = n; while (high >= 10) { high = high / 10; pow *= 10; } int last = n - high * pow; // 除去最高位的数字 int cnt = high == 1 ? last + 1 : pow; return cnt + high * NumberOf1Between1AndN_Solution(pow - 1) + NumberOf1Between1AndN_Solution(last); } };
int pow = 1, high = n; while (high >= 10) { high = high / 10; pow *= 10; }
int last = n - high * pow; // 除去最高位的数字 int cnt = high == 1 ? last + 1 : pow; return cnt + high * digitOneInNumber(pow - 1) + digitOneInNumber(last); } };