zoukankan      html  css  js  c++  java
  • 将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个数。

  • 相关阅读:
    Swing编程基础 之二
    数据库有几种
    世界上所有的电脑操作系统
    Linux基础命令-有关于目录的命令
    Oracle Flashback 闪回
    Linux CentOS6.5下安装Oracle ASM
    如何将U盘内文件拷入VMware Linux CentOS6.5虚拟机
    iptables 开启端口
    在Oracle SQLplus下建用户 建表
    Linux CentOS中使用SQL*Plus启动和关闭数据库
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5982570.html
Copyright © 2011-2022 走看看