• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ArgenBarbie
博客园    首页    新随笔    联系   管理    订阅  订阅
将1~n个整数按字典顺序进行排序,返回排序后第m个元素

给定一个整数n,给定一个整数m,将1~n个整数按字典顺序进行排序,返回排序后第m个元素。n最大可为5000000。字典排序的含义为:从最高位开始比较。1开头的数字排在最前面,然后是2开头的数字,然后是3开头的数字……最高位相同的数字,按同样的逻辑比较次高位……以此类推。
例:给定整数为n=13,m=5,那么字典排序结果为: [1,10,11,12,13,2,3,4,5,6,7,8,9] ,程序最终输出为13。

输入:m, n

输出:第m个数

#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<limits.h>
#include<algorithm>
#include<cstring>
using namespace std;

//返回以数字k开头,<=n的数的个数
int getNum(int n, int k)
{
    int base = 1, sum = 0;
    while (n >= base * (k+1) -1)
    {
        sum += base;
        base *= 10;
    }
    if (n >= base * k)
        sum += n - base * k + 1;
    return sum;
}

int ans = 0;
void getMth(int n, int m, int& k, int cur)
{
    if (++k == m)
    {
        ans = cur;
        return;
    }
    for (int i = 0; i <= 9; i++)
    {
        int t = cur * 10 + i;
        if (t <= n)
            getMth(n, m, k, t);
        if (k >= m)
            return;
    }
}

int main()
{
    int m, n, k = 0;
    cin >> m >> n;
    for (int i = 1; i <= 9; i++)
    {
        int num = getNum(n, i);
        if (num < m)
            m -= num;
        else
            break;
    }
    getMth(n, m, k, 1);
    cout << ans << endl;
    return 0;
}

先找到第m个数是1~9哪个数字开头。

然后找这个数字开头的所有数中不超过n的第m个数。

posted on 2016-10-20 21:07  ArgenBarbie  阅读(8199)  评论(4)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3