引言
这是最近在网上看到,好像是阿里算法岗的一个编程题,所以没事做了一下,感觉非科班的做起来挺难顶的,花了不少时间,这里写了博客记录下,以防自己忘记。
题目概述
菜鸟仓库是一个很大很神奇的地方,各种琳琅满目的商品整整齐齐地摆放在一排排货架上,通常一种品类(sku)的商品会放置在货架的某一个格子中,格子设有统一的编号,方便工人们拣选。有一天沐哲去菜鸟仓库参观,无意中发现第1个货架格子编码为1,第2-3个分别为1,2,第4-6个格子分别是1,2,3,第7-10个格子编号分别是1,2,3,4,每个格子编号都是0-9中的一个整数,且相邻格子的编号连在一起有如下规律1|12|123|1234|…|123456789101112131415|…|123456789101112131415……n 这个仓库存放的商品品类非常丰富,共有1千万多个货架格子。沐哲很好奇,他想快速知道第k个格子编号是多少?
直接上代码(后续会把数字排列的规律写上来)
下面展示一些 内联代码片
。
def find_row(n):
input = n
index = 1
val = 0
front_sum = 0
while input > val:
val_last = val
val += front_sum + len(str(index))*(index-10**(len(str(index))-1)+1)
if index%9 == 0:
front_sum += len(str(index))*9*10**(len(str(index))-1)
#print("front_sum = ",front_sum)
#print("val = ",val)
#print("val_last",val_last)
index += 1
index_cols = val-val_last
return index-1,index_cols,val_last
def find_num(col):
digit = 1
digit_sum = 9
while col > digit*digit_sum:
col -= digit*digit_sum
digit += 1
digit_sum *= 10
print("digit = ", digit)
print("col==", col)
index = 1
if digit >1:
while(col>digit):
col -= digit*index
index += 1
num = 10**(digit-1)+index-1
return str(num)[col-1]
return col
if __name__ == '__main__':
box = 46
#row:格子所在行号
#now_cols:该行总列数
#val_last:该行之前的所有格子总数
row, now_cols,val_last = find_row(box)
print("row: ",row)
print("now_cols: ",now_cols)
print("val_last: ",val_last)
cols = box-val_last
print("cols = ",cols)
print(find_num(cols))
第一个函数find_row其实就是为了算出这个格子在第几行第几列,规律就是上图,每一次升位(从1位数变两位数)就把前一位数所有的格子存入front_sum。
相关链接
`