前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Find the nth digit(二分查找) - HDU 1597

Find the nth digit(二分查找) - HDU 1597

作者头像
ACM算法日常
发布2018-08-07 18:42:28
3710
发布2018-08-07 18:42:28
举报
文章被收录于专栏:ACM算法日常ACM算法日常

Problem Description

假设:

S1 = 1

S2 = 12

S3 = 123

S4 = 1234

.........

S9 = 123456789

S10 = 1234567891

S11 = 12345678912

............

S18 = 123456789123456789

..................

现在我们把所有的串连接起来

S = 1121231234.......123456789123456789112345678912.........

那么你能告诉我在S串中的第N个数字是多少吗?

Input

输入首先是一个数字K,代表有K次询问。

接下来的K行每行有一个整数N(1 <= N < 2^31)。

Output

对于每个N,输出S中第N个对应的数字.

Sample Input

6

1

2

3

4

5

10

Sample Output

1

1

2

1

2

4

题意容易理解,但是做到高效需要注意二分查找的写法。

关于二分检索:

二分检索的思想是每次把范围缩小一半。例如,你需要在一个从小到大有 序的有15个元素的线性表中查找数11 ,而已知第8个数是“6”,“11”如果在 表中,那么它一定在第9个数〜第15个数这个范围之内。

解题说明:

本题只是使用常规的二分查找,由于没有使用递归,性能会好很多。本题最关键的地方在于使用了一张表保存所有的位置信息,进而进行区间划分,使得后面能够使用二分查找解题。

源码:G++ 0ms

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    //静态存储区默认值为0,66000是调整的值,只要不WA,可以尝试从大往小调
    static int sum[66000];
    int index;
    int position;
    //初始化表,这张表记录了每个区间的位置
    //0,1(0+1),3(1+2),6(3+3)...
    for (int i = 1; i < 66000; ++i) {
        sum[i] = sum[i - 1] + i;
    }

    int count;
    scanf("%d", &count);

    while (count--) {
        scanf("%d", &position);
        index = -1;
        int l = 1;
        int r = 66000;
        //二分查找
        while (1) {
            //每次进来算出新的中间位置
            int mid = (l + r) / 2;
            //正好在区间里面,注意这里是index=mid
            if (sum[mid] < position && sum[mid + 1] >= position) {
                index = mid;
                break;
            }
            //如果在左区间,则将r指针指向中间
            if (position <= sum[mid])
                r = mid - 1;
            //如果在右区间,则将l指针指向中间
            if (sum[mid + 1] < position)
                l = mid + 1;
        }
        //n为位置,减去区间值,则是剩余的值,如101,如果区间值为90
        //则剩余11,这个11代表的肯定是12345678912这样的串
        int value = position - sum[index];
        //取余,去掉1-9这样的重复串
        value %= 9;
        if (value == 0) {
            value = 9;
        }
        printf("%d\n", value);
    }
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档