字典序(今日头条2017秋招真题)
来源:互联网 发布:知乎无法注册 编辑:程序博客网 时间:2024/06/13 08:16
给定整数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。
样例输入
11 4
输出
输出仅包括一行,即所求排列中的第m个数字。
样例输出
2
这道题又是一道Trie数问题
既然是字典序,那么很自然,我们可以考虑使用字典树来实现,但是,这里并不需要真的生成这个字典树,而只需要计算对应分支的节点数就行了。
1. 首先从1开始,如果1分支的节点数>m,那么第m个数肯定是以1开头,进一步搜索其子节点,搜索子节点时不用再搜索1了,所以是搜索1分支的第m-1个节点。
2. 如果1分支的节点数
#include<iostream>#include<vector>using namespace std;long long getCountOfstart(long long start, long long n)//找到小于n的,以ret开头的树的个数{ long long base =1,count = 0; while(n>=(start+1)*base -1) { count += base; base = base*10; } if(n >= start*base ) count += n-start*base+1; return count;}long long getNum(long long m,long long n){ long long k = 1; while(m!=0) { long long count = getCountOfstart(k, n); if(count >= m)//当子节点数大于等于m时,第m个数就在子节点中寻找,res*10为子节点的第一个,m递减1,直到m=0就找到了那个数 { m--; if(m==0) break; k = k*10; } else//当子节点数小于m时,第m个数就要在右边的节点中寻找子节点,m减掉当前子节点数,结果加1就到了右边相邻的节点 { k++; m = m -count; } } return k;}int main(){ long long n,m;//这里数据类型都要是64位的long long,所以今日头条的题还是很变态的,数据量真大 cin>>n>>m; cout<<getNum(m,n)<<endl; return 0;}
阅读全文
0 0
- 字典序(今日头条2017秋招真题)
- 面试题——字典序(今日头条2017秋招真题)
- 头条校招(今日头条2017秋招真题)
- 异或(今日头条2017秋招真题)Trie树
- 异或(今日头条2017秋招真题)
- 【2017今日头条】头条校招
- 今日头条(TodayNews)
- 今日头条——校招在线编程题《字典序》
- 今日头条2017实习生面试(三轮)
- 最大映射(今日头条2017笔试)
- 2017今日头条测试开发
- 2017今日头条测试编程题
- 【算法】今日头条2017编程题
- 今日头条2017实习生笔试题解
- 2017今日头条实习测试
- 今日头条2017内推
- 今日头条2017后端工程师
- 高仿今日头条(转载)
- 更新二进制位
- 一道动态规划算法题
- 深入理解Callable
- 自定义view实现一个游标效果
- C#获取所有串口号
- 字典序(今日头条2017秋招真题)
- Metasploit与渗透测试简介
- 关于es启动的相关报错
- 垃圾回收机制
- spark stage的划分和task分配
- 泛型的定义和使用
- 进程与线程之间那些事儿:
- 简单的数据库操作与变量
- 【bzoj2789】[Poi2012]Letters