給定整數n和m, 將1到n的這n個整數按字典序排列之後, 求其中的第m個數
。
對於n=
11, m=
4, 按字典序排列依次為1,10
,11,2
,3,4
,5,6
,7,8
,9, 因此第4個數是2.
對於n=
200, m=
25, 按字典序排列依次為1
10100
101102
103104
105106
107108
10911
110111
112113
114115
116117
118119
12120
121122
123124
125126
127128
12913
130131
132133
134135
136137
138139
14140
141142
143144
145146
147148
14915
150151
152153
154155
156157
158159
16160
161162
163164
165166
167168
16917
170171
172173
174175
176177
178179
18180
181182
183184
185186
187188
18919
190191
192193
194195
196197
198199220
20021
2223
2425
2627
2829330
3132
3334
3536
3738394
4041
4243
4445
4647
4849550
5152
5354
5556
5758596
6061
6263
6465
6667
6869770
7172
7374
7576
7778798
8081
8283
8485
8687
8889990
9192
9394
9596
9798
99 因此第25個數是120…
輸入僅包含兩個整數n和m。
資料範圍:
對於20
%的資料,
1<= m <= n <=5;
對於80
%的資料,
1<= m <= n <=10^
7; 對於100
%的資料,
1<= m <= n <=10^
18.
輸出僅包括一行, 即所求排列中的第m個數字.
輸入例子1:11
4輸出例子1
:2
同樣這道題不能暴力求解,如果使用額外記憶體暴力排序會發現超出記憶體限制,同樣解決這道題需要另闢捷徑
#include
using
namespace std;
//包括自己的節點數,即字典樹的數字pre分支的所有節點數
//pre分支的深度為1的孩子:pre*10,pre*10+1,pre*10+2,...,pre*10+10-1,
//孩子數為10
//pre分支的深度為2的孩子:pre*100,pre*100+1,pre*100+2,...,pre*100+100-1,
//孩子數為100
long
getcntofpre
(long pre,
long n)
else
}return cnt;
}//該函式是尋找第m個數是什麼,通過節點數進行分支選擇
//如果該分支的節點數較m來說過少,那麼第m的數肯定不在這個分支上,檢測下個分支
//檢測下個分支的時候,不是在這個分支尋找第m的數字,而是尋找第(m-上乙個分支的節點數)的數
//如果分支的節點數較m來說過多, 選擇該分支,如果m為1,那麼答案就是這個分支的根節點
long
solve
(long n,
long m)
//在該分支的孩子分支上,從第一孩子開始尋找
ans *=10
;//ans對應的是乙個字典前序,如10,11,12,13,其字典分支
//為101,102,1001,110,1100,1200,1201,1300,1301,1309,1310等
}else
}return ans;
}int
main()
return0;
}
字典序(位元組跳動2017秋招第3題)
我的心願是世界和平 題目描述 給定整數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 的...
字典序演算法
字典序排列就是按照字典a z,1 9的順序給出字串的順序全排列,例如abc的全排列就是從abc一直排到cba。那麼給定乙個字串,怎麼找出恰好大於該字串的下乙個排列呢?我們考慮如下的步驟 1 假設字串為p1 p2 pn 我們從後往前尋找第乙個符合pj j 1條件的字元pj 也就是說,p1 p2 pj ...
字典序問題
碰到過很多求關於字典序的問題,一直都是用的c 的stl庫中的函式水過的,今天終於有機會,算是對字串字典序問題的乙個總結吧。如果已知乙個字串 abc 為了更直觀,我們把建立如下對映 a 1 b 2 c 3 我們把這三個字母的所有排列都寫出來,有 序號字串 對映數字 1abc 1232 acb132 3...