首页 > 解决方案 > AoC 第 8 天问题(Java)

问题描述

我试图解决一个编程圣诞节问题,你可以在这里阅读:代码第 8 天出现

我使用 Java 来解决这个问题,所以我有以下函数,其中list每个索引包含输入文件的一个操作:

public int calculate_P1() {
    boolean[] config = new boolean[list.size()];
    int acc=0;

    for (int i = 0; i < list.size(); i++) {

        if (list.get(i).substring(0, 3).equals("nop")) {
            if (config[i] == true) break;
            config[i] = true;
            continue;
        }

        if (list.get(i).substring(0, 3).equals("acc")) {
            if (config[i] == true) break;
            config[i] = true;

            if (list.get(i).charAt(4) == '+') acc += Integer.parseInt(list.get(i).substring(5));
            if (list.get(i).charAt(4) == '-') acc -= Integer.parseInt(list.get(i).substring(5));
            continue;
        }

        if (list.get(i).substring(0, 3).equals("jmp")) {
            if (config[i] == true) break;
            config[i] = true;

            if (list.get(i).charAt(4) == '+') i += (Integer.parseInt(list.get(i).substring(5)));
            if (list.get(i).charAt(4) == '-') i -= (Integer.parseInt(list.get(i).substring(5)));

            i--;
        }
    }

    return acc;
}

这可以正确解决示例输入,但是输入文件要长得多,我得到261的输出应该是1179......我做错了什么?

标签: java

解决方案


问题是这两个语句jmp

        if (list.get(i).charAt(4) == '+') i += (Integer.parseInt(list.get(i).substring(5)));
        if (list.get(i).charAt(4) == '-') i -= (Integer.parseInt(list.get(i).substring(5)));

如果语句是jmp +443(我输入中的第一个跳转语句)第一行已经更改i,然后第二行if不再检查jmp +443语句的操作数,它会检查跳转目标的操作数。

根据我的输入,第一个跳转目标处的指令是acc -1,这意味着第二个 if 语句也被评估,这意味着新i的计算错误。

更好的解决方案是使用if / else if组合:

        if (list.get(i).charAt(4) == '+') 
            i += (Integer.parseInt(list.get(i).substring(5)));
        else if (list.get(i).charAt(4) == '-') 
            i -= (Integer.parseInt(list.get(i).substring(5)));

然而,最简单的解决方案是让Integer.parseInt()照顾+-标志:

        i += Integer.parseInt(list.get(i).substring(4));

(这也可以应用于“acc”案例......)


推荐阅读