给定一个正整数n,请返回0到n的数字中2出现了几次。
int result = 0;
for (int i = 1; i <= n; i *= 10) {
result += (n / i + 7) / 10 * i + (n / i % 10 == 2 ? n % i + 1 : 0);
}
return result;
为什么这样写可以实现题目要求
由于公司网络原因,这里不能发太长的内容,先贴一段我“翻译”后的Python
代码,晚上下班后再更新该算法的详细解释。
result = 0
i = 1
n = 230
while i <= n:
if i == 1:
'''
求个位上的所有2,当n的最后一位是2时这个2忽略,放到下面的`if`语句中求
+7的意思是除去n的最后一位是2的情况,
譬如从13开始到22,+7后/10的结果均为2,而23就是3了
'''
result += (n + 7) / 10
if n % 10 == 2: # n的个位为2时,个位的2
result += 1
elif i == 10:
'''
十位上的2,因此要先/10,+7同理,如果n的十位为2,则暂时忽略这些2,留到if中判断
最后要x10是因为如果n的十位大于2,则十位上必然有10的倍数个2,
譬如N=30,20-29中十位上的2有10个,具体是10的多少倍,靠(n / 10 + 7) /10来判断
'''
result += (n / 10 + 7) / 10 * 10
if n / 10 % 10 == 2: # n的十位为2时,十位的2
result += n % 10 + 1
elif i == 100:
result += (n / 100 + 7) / 10 * 100
if n / 100 % 10 == 2:
result += n % 100 + 1
'''
更大的位数依次类推
'''
i *= 10
print result