阿里算法工程师2018笔试题——菜鸟货架编号,O(n)解法

题目描述:
题目简述: 
仓库编号为0-9整数 
以下为一示例: 
1|12|123|1234|12345|……|12345678910111213141516|… 
每一个整数代表一个格子,现给出一格子位置(从左到右第几个)求其编号 
数据范围:1 ≤ k≤ 10^9


思路:
观察到:
第c行有c个数字
把从1到c累加起来,就有c*(c+1)/2个。

假设:
第k个号码在第c+1行,第p个

那么就有关于p的恒等关系:
k-p=c*(c+1)/2

求p的解法就是:
那么把c从1到k遍历,就可以获得p
比较p跟c+1的大小:如果p>c+1,那么也就是这一行里没有这么大的一个index,那么就舍弃,直到p<=c+1
知道了p是多少,就知道了第k个是这一行里第p个
因为这个编号都是p mod 10那么就p mod 10得答案

复杂度:
遍历一次,所以O(n)

代码:
k=int(input())
for c in range(1,k):
    p=int(k-((c+1)*c)/2)
    if p<=(c+1):
        print (p%10)
        break

#阿里巴巴##算法工程师#
全部评论
这是sqrt(n)吧
点赞 回复 分享
发布于 2017-09-15 17:23
第c行不是c个数字,123456789/12345678910/1234567891011
点赞 回复 分享
发布于 2017-09-15 19:25

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
点赞 7 评论
分享
牛客网
牛客企业服务