2017阿里校招笔试附加题2 菜鸟仓库货架编号问题

推荐一下个人博客
题目简述:
仓库编号为0-9整数
以下为一示例:
1|12|123|1234|12345|……|12345678910111213141516|…
每一个整数代表一个格子,现给出一格子位置(从左到右第几个)求其编号
最近在学c++所以说笔试就用c++试试
这道题乍看不难,不过我觉得题目中说数量千万级所以没有用暴力的方法。
验证正确性:
1-60
编号为
1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 0 1 2 3
测试性能:
第1e14个货架
货架编号:3
Use Time:0.018895 s

/** 请完成下面这个函数,实现题目要求的功能 **/
/** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^  **/

#include 
#include 
#include 
#include 
#include 

long long _GetLength(long long digit)
{
    if (digit == 0)
        return 0;
    long long length = 0;
    for (long long i = 1; i <= digit; ++i)
    {
        if (i == 1)
            length += pow(10, i) - pow(10, i - 1);
        else
            length += i * (pow(10, i) - pow(10, i - 1));
    }
    return length;
}

long long GetLength(long long digit)
{
    long long length = 0;
    for (long long i = 1; i <= digit; ++i)
        length += (pow(10, i) - pow(10, i-1)) * (_GetLength(i) + _GetLength(i-1) + i) / 2;
    return length;
}

long long GetDigit(long long n){
    long long digit = 1;
    long long tmp = 0;
    while (true)
    {
        tmp = GetLength(digit);
        if (tmp > n)
            break;
        ++digit;
    }
    return digit;
}

int GetNumber(long long n)
{
    int digit_n = 1;
    while (_GetLength(digit_n) < n) {
        ++digit_n;
    }
    long long tmp = n - _GetLength(digit_n - 1);
    if (digit_n == 1)
        return int(tmp);
    else
    {
        long long result = (tmp + digit_n - 1) / digit_n - 1 + int(pow(10, digit_n-1));
        int i = digit_n - (tmp - 1) % digit_n;
        return result % int(pow(10, i)) / int(pow(10, i-1));
    }
}

int Get(long long n)
{
    long long digit = GetDigit(n);
    int count = 1;
    long long tmp = _GetLength(digit - 1);
    n -= GetLength(digit - 1);
    while (true) {
        if (n > tmp + digit * count)
        {
            n -= (tmp + digit * count);
            ++count;
        }
        else
            break;
    }
    if (n == 0)
        return 9;
    else
        return GetNumber(n);
}

int main()
{
    double dur;
    clock_t start,end;
    start = clock();
//    long long n = 1;
//    std::string test("");
//    for (int i = 1; i <= 1000; ++i) {
//        for (int j = 1; j < i; ++j) {
//            test += std::to_string(j);
//            if ((int(test[n-1]) - '0') != Get(n))
//            {
//                printf("error\n%lld\n%d  %d", n, int(test[n-1]) - '0', Get(n));
//                return -1;
//            }
//            n += std::to_string(j).size();
//            //printf("%d ", j);
//        }
//        //printf("\n");
//    }//验证程序正确性
    printf("%d\n", Get(1e14));
    end = clock();
    dur = (double)(end - start);
    printf("Use Time:%f\n",(dur/CLOCKS_PER_SEC));
    return 0;
}

笔试最后时间太紧没完全提交上去,已跪。

你可能感兴趣的:(笔试,机器学习,c++,阿里巴巴,笔试,算法,c语言)