题解 | #火车进站#

火车进站

https://www.nowcoder.com/practice/97ba57c35e9f4749826dc3befaeae109

运行时间:66ms
超过100.00% 用Java提交的代码
占用内存:13328KB
超过100.00% 用Java提交的代码
  1. 递归,将出站顺序记为一个数字,对数字进行排序要比字符串排序快得多,如1,2,3记为123,这样可以使用TreeSet来自动排序。
  2. 用数字还有一个好处就是数字是基本数据类型而不是引用数据类型,不需要考虑递归过程中对引用数据类型的改变。
  3. 如果有n辆车,那么最终出站数字序列的量级一定是10^(n - 1),比如3辆车的出站序列123的量级是100,判断递归终止的条件就是当前数字序列达到了量级10^(n - 1).
  4. 最后将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);
        }
    }
}





全部评论

相关推荐

头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务