2017.8.27 阿里巴巴算法工程师笔试(2)

来源:互联网 发布:ubuntu键盘左alt没反应 编辑:程序博客网 时间:2024/05/16 10:16

题目

菜鸟仓库是一个很大很神奇的地方,各种琳琅满目的商品整整齐齐地摆放在一排排货架上,通常一种品类(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个格子编号是多少?

要求

输入:
货物的序号K,是一个整数
输出:
货物的编码
输入范例:
10
输出范例:
4

分析

注意: 每一排放入自己所有的编号,例如‘10’表示两个编号,所以要将整数10拆成1和0两个字符串

代码

#include <vector>#include <climits>#include <cstdio>#include <string>#include <iostream>#include <algorithm>#include <map>#include <iomanip>using namespace std;int findNthDigit(int n) {    long long int a = 9;    long long int k = 1;    long long int dd = 1;    while (n>a*k) {        n -= a*k;        a = a * 10;        k++;        dd = dd * 10;    }    int m = (n - 1) / k;    int ll = k - (n - 1) % k - 1;    int now = dd + m;    while (ll--) {        now = now / 10;    }    return now % 10;}int f(int a) {    int ji = 0;    while (a) {        a = a / 10;        ji++;    }    return ji;}int main() {    int k;    cin >> k;    int a = 1;    int tmp = 1;    int res = 0;    while (a < k) {        res += a;        k = k - a;        tmp++;        a = a + f(tmp);    }    cout << findNthDigit(k);    //cout << tmp1 <<" "<< tmp2 << " "<<tmp3 << endl;    system("pause");    return 0;}
阅读全文
1 0