n范围数字内数字1的个数
原题在这里:
概述题意:求n范围内的数字中,数字1的个数。
analyse:
我起初做这个题的时候,也是考虑的从每一位数字上去分析这个位能给ans提供多少个1,但终究是太nen了,想得稀奇古怪,不过最后还是瞎捣鼓4小时以后还是ac了,虽然写得很混乱,人也没忍住我老是写错我想要的逻辑,写完连题解都不想看了,搁置了许多天。
分析学习在这里。
那是该想到的都想到了,就是实现的逻辑不同,人家纯纯数学带佬,我就不一样,瞎鼓捣,要不是有力扣可以无限提供样例,我多半不会写出来。
但是着实没办法(无能狂怒)
由于我的code非常乱,所以:
class Solution { string s; int l, len; int dfs(int x) { string p = s.substr(0, l - x); string q = s.substr(l - x + 1, x); int u = atoi(p.c_str()), v = atoi(q.c_str()); int sum = 0, tp = -1; if (x != 0 && x != l) { tp = u + (s[l - x] > '1'); sum += pow(10, x) * tp + (s[l - x] == '1' ? v + 1 : 0); } else { sum += u; if (l - x == 0) sum += s[l - x] > '1' ? pow(10, x) : v + 1; else sum += s[l - x] >= '1'; } if (x < l) return dfs(x + 1) + sum; else return sum; } public: int countDigitOne(int n) { s = to_string(n); l = s.length() - 1; if (!n) return 0; len = log10(n); return dfs(0); } };
一通分析下来的数学代码(int会被卡一下,所以得用long):
class Solution { public: int countDigitOne(int n) { int ans = 0; long i = 1, m = n; while (i <= m) { ans += (m / (i * 10)) * i + min(max(m % (i * 10) - i + 1, (long)0), i); i *= 10; } return ans; } };
【Over】

浙公网安备 33010602011771号