今日头条——校招在线编程题《字典序》
2017-10-24 21:05
435 查看
题目描述
给定整数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个数字.
给定整数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; }
相关文章推荐
- 今日头条2017秋季校招在线编程题解法参考
- String Shifting- 今日头条校招2016-09-28在线编程题
- 今日头条校招2016-09-28在线编程题(2题)
- 今日头条2018校招算法方向(第一批)编程题1(离散+树状数组)
- 今日头条2017校招编程题
- 今日头条2018校招算法方向(第一批)编程题2(枚举)
- 牛客网--今日头条2018校招算法方向(第一批)编程题1、编程题2
- 今日头条2018校招测试开发方向(第一、二、三、四批)编程题汇总 - 题解
- [编程题] 头条校招
- 今日头条2018春季校园招聘研发岗位笔试编程题2
- 今日头条2017暑期实习生招聘笔试编程题之函数最宽尖峰
- 今日头条——校招在线编程题《头条校招》
- 今日头条2018春季校园招聘研发岗位笔试编程题4
- 今日头条2017校招(出题数目)
- 完美世界校招在线笔试题-互联网Java(11月1日)编程题
- 字典序(头条校招java)
- 阿里巴巴2017校招C++岗位在线编程题-RNA嵌套
- 滴滴2016.09.06校招 在线笔试 - 2道编程题
- 网易2018校招在线编程题-第一题
- 题解-今日头条2018校招后端方向(第四批)