规律题还是少碰,感觉提高不大。
1、数字序列中某一位的数字
思路是每次去除对应位数的总和,比如1位的总数是9,二位的总和是180… 分别减去1位数的总和,二位数的总和等等,最后剩余部分就是最上层的位数 对应的数了。
class Solution:
def findNthDigit(self, n):
if n <= 0:
return 0
res = 1
num = 1
tmp = 9
while n >= res + tmp * num:
res += tmp * num
num += 1
tmp *= 10
tmp /= 10
num -= 1
result = n - res
return int(str(10**num + result // (1+num))[result%(1+num)])
2、1-n整数中1出现的次数
做法就是依次计算每一位可能出现的次数,然后相加起来。其实还是有规律的。
如果是2004, 每一位出现的次数分别是 : 1000-1004; 0100-1199; 0010-1919; 0001 - 2001
上述的规律就是 000-004; 000-199=200也就是高位+1; 000-199同理; 000-200
上述其实包含小于1的情况,就是只保留高位; 如果等于1,则是保持原样; 大于1则是高位加1.
class Solution:
def countDigitOne(self, n: int) -> int:
digit, res = 1, 0
high, cur, low = n // 10, n % 10, 0
while high != 0 or cur != 0:
if cur == 0: res += high * digit
elif cur == 1: res += high * digit + low + 1
else: res += (high + 1) * digit
low += cur * digit
cur = high % 10
high //= 10
digit *= 10
return res