將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個數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM