1. A。
2. D。
3. A。
4. A。
5. D。
这段代码的主要原理是通过一个已经有的排列,推断出该排列在字典序中的下一个排列。操作方法很简单:假设当前排列中的第 $i$ 个的值为 `data[i]` ,那么就倒着寻找第一个可以使 `data[i]` 变大的下标,设为 $k$ ,令 `data[k]` 变成一个更大的数字,这样就可以使得字典序增大。同时为了保证这是在字典序上直接与当前排列相邻的排列,我们需要让 `data[k+1...m]` 这部分构成的序列字典序最小(在不修改 `data[1...k-1]` 的情况下)。所以我们需要重新对其值进行分配,也就是代码中 `if(flag)` 分支的部分。