The specific question is as follows:
Select N numbers from 1--9 to form a non-repeating N number of digits, number them from small to large, and when you enter any of the numbers M, you can find the The numbers correspond to the numbers of
. For example, N=3, M=213. Output: [123(1), 132(2), 213(3), 231(4), 312(5), 321(6)]--->X=2
The first thing I thought of when I saw the question was to generate a fully arranged array from smallest to largest, and then traverse the array to get the corresponding serial number (array subscript plus 1), or I thought of each one from smallest to largest. Generate push into the array, and then determine whether the number is the number given by the current question. If so, the required sequence number is the length of the current array. What is better than the previous one is that there is no need to waste time to calculate and generate the subsequent items. The complexity of the generation itself is not high. If it is expanded to hexadecimal or even hexadecimal and a large number is given, it will not be good. It will also waste some space to save unused data. Maybe we can try other methods that don't require generation.
Let’s idealize the question first. If a number N is given, then M is composed of N digits from 1 to N (for example, N=4, then M is composed of 1234 digits, not other 1349 and other combinations). The reason for this is that we need to simplify the conditions so that we can analyze the commonalities and get a solution to the problem, and it is not difficult to transform from a random situation into an ideal situation, so this article will not be lengthy. Let’s first analyze the example given in the question, [123(1), 132(2), 213(3), 231(4), 312(5), 321(6)] 213 is in the third digit, and the first digit is 2. That is to say, those whose first number is 1 are all in front of it (123,132). Let’s look at the combination of the second number and the following number 13. The first letter 1 is already the smallest. There cannot be any number in front of it, and the third There is no need to look at the number 3, because if the previous digits are determined, there is only one possibility for the last digit. The result is that 213 is preceded by 2 (first digit) 0 (second digit) 0 (last digit) )=2 numbers, that is to say, the current number is in the 3rd digit. By comparison, the answer is indeed like this, and the analysis of other numbers is the same. From this we can conclude that we need a function (that is, setAll() in the code below) that can calculate the total number of possibilities that a certain digit is smaller than the current number, and then add up to 1 to get the desired result. Please see the code implementation: