题解 | #火车进站#
火车进站
https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109
运行时间:66ms 超过100.00% 用Java提交的代码 占用内存:13328KB 超过100.00% 用Java提交的代码
- 递归,将出站顺序记为一个数字,对数字进行排序要比字符串排序快得多,如1,2,3记为123,这样可以使用TreeSet来自动排序。
- 用数字还有一个好处就是数字是基本数据类型而不是引用数据类型,不需要考虑递归过程中对引用数据类型的改变。
- 如果有n辆车,那么最终出站数字序列的量级一定是10^(n - 1),比如3辆车的出站序列123的量级是100,判断递归终止的条件就是当前数字序列达到了量级10^(n - 1).
- 最后将TreeSet里的数字序列依次取出来,因为每个数字的量级scale都是相同的,所以对于每个数字序列,可以很方便地从高位到低位取出每个数字进行字符串拼接。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] parts = br.readLine().split(" ");
int[] identifiers = new int[n];
for (int i = 0; i < n; i++) {
identifiers[i] = Integer.parseInt(parts[i]);
}
Solution sl = new Solution();
System.out.println(sl.getProgrammes(identifiers, n));
}
}
class Solution {
int num;
int scale;
int[] identifiers;
public StringBuilder getProgrammes(int[] identifiers, int num) {
this.num = num;
this.identifiers = identifiers;
scale = (int) Math.pow(10, num - 1);
TreeSet<Integer> digitalForm = new TreeSet<>();
dfs(digitalForm, 0, 0, 0);
StringBuilder programmes = new StringBuilder();
for (int digit : digitalForm) {
int scale = this.scale;
while (digit != 0) {
programmes.append(digit / scale).append(" ");
digit = digit % scale;
scale /= 10;
}
programmes.append("\n");
}
return programmes;
}
public void dfs(TreeSet<Integer> digitForm, int programme, int station, int cur) {
//进站
if (cur < num) {
int newStation = station * 10 + identifiers[cur];
dfs(digitForm, programme, newStation, cur + 1);
}
//出站
if (station != 0) {
programme = programme * 10 + station % 10;
station /= 10;
if (programme / scale != 0) {
digitForm.add(programme);
return;
}
dfs(digitForm, programme, station, cur);
}
}
}

查看3道真题和解析
OPPO公司福利 1049人发布