【每天一道算法题】恍如隔世

时间过得真是好快,过了怎样的一年半一言难尽

又到了找暑假实习的时候,翻出这个博客作为午夜余兴

今天找了这么一个题,不知道这赶脚像是高中数学题的题目还算不算算法题,哈哈


给你这么个数列
112123123412345123456123456712345678123456789123456789101234567891011...
看出规律了吗 这个数列是由下列数列串合而成:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
12345678910...
...

现在问题是给定1<=i<=2147483647
要求此数列的第i位


我的思路是这样哒,这些数列串应该分类讨论,最后一个数是1位的,最后一个数是2位的,最后一个数是3位的……

这样就比较容易计算每个数列串的长度,由于i的范围是有限度的,所以可以事先把以n位结尾的数列串的最大长度算出来,接下来就可以分情况讨论啦

然后总数列也可以切分为这么几段来计算了:

设现在有k个数列串组成了整个数列

k是1位数的数列中,length = ( 1 + k ) * k / 2

k是2位数的数列中,length = ( 1 + 9 ) * 9 / 2 * ( 1 + k - 9 ) + 2 * ( 1 + k - 9 ) * ( k - 9 ) / 2

k是3位数的数列中,length = ( 1 + 9 ) * 9 / 2 * ( 1 + 99 - 9 ) + 2 * ( 1 + 99 - 9 ) * ( 99 - 9 ) / 2 + 3 * ( 1 + k - 99 ) * ( k - 99 ) / 2

.

.

.

然后算出k作为各个位数的最大长度,对于给出的i判定在哪个区间内,然后就可以代入计算i落在哪个k,k+1之间然后就容易计算啦~

就算这个傻博客木有人看,算是自己对自己的督促吧~括弧笑~






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值