您的位置:首页 > 编程语言

今日头条——校招在线编程题《字典序》

2017-10-24 21:05 357 查看
题目描述

给定整数n和m, 将1到n的这n个整数按字典序排列之后, 求其中的第m个数。

对于n=11, m=4, 按字典序排列依次为1, 10, 11, 2, 3, 4, 5, 6, 7, 8, 9, 因此第4个数是2.

输入描述:

输入仅包含两个整数n和m。

数据范围:

对于20%的数据, 1 <= m <= n <= 5 ;

对于80%的数据, 1 <= m <= n <= 10^7 ;

对于100%的数据, 1 <= m <= n <= 10^18.

输出描述:

输出仅包括一行, 即所求排列中的第m个数字.

C++代码:

//主要采用字典树的思想
#include<iostream>
using namespace std;

long get_num(long long k,long long n){
long long base=1,count=0;
while((k+1)*base-1<=n){
count+=base;
base*=10;
}
if(k*base<=n)
count+=n-k*base+1;
return count;
}
long long ans(long long n,long long m){
long long k=1;
while(m){
long long count=get_num(k,n);
if(count>=m){
m--;
if(!m)  break;
k*=10;
}
else{
k++;
m-=count;
}
}
return k;
}
int main(){
long long n,m;
cin>>n>>m;
cout<<ans(n,m)<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: