菜鸟仓库-货物格子问题编程题

引言

这是最近在网上看到,好像是阿里算法岗的一个编程题,所以没事做了一下,感觉非科班的做起来挺难顶的,花了不少时间,这里写了博客记录下,以防自己忘记

题目概述

菜鸟仓库是一个很大很神奇的地方,各种琳琅满目的商品整整齐齐地摆放在一排排货架上,通常一种品类(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。
第一个函数find_row其实就是为了算出这个格子在第几行第几列,规律就是上图,每一次升位(从1位数变两位数)就把前一位数所有的格子存入front_sum。

相关链接

链接: https://blog.csdn.net/bertdai/article/details/77620139?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_utm_term-0&spm=1001.2101.3001.4242.

`

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值