Java if语句不适用于这种情况吗?

时间:2016-12-06 04:30:09

标签: java algorithm

我正在尝试一些比赛问题,当然,没有逻辑地冲过他们看我最快的时间。但是,这是我无法开始工作的那个......

import java.util.ArrayList;

import java.util.Scanner;

public class Main {

    private static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {

        ArrayList<Integer> values = new ArrayList<>();

        int n = input.nextInt();

        for(int i = 0; i < n; i++) {
            values.add(input.nextInt());
        }

        boolean done = false;

        while(!done) {

            System.out.println("Beginning");
            for(int i = 0; i < values.size(); i++) {
                System.out.print(values.get(i) + " ");
            }
            System.out.println();

            done = true;

            int changes = 1;

            while(changes != 0) {
                changes = 0;
                for (int i = 0; i < values.size() - 1; i++) {
                    if (values.get(i) == values.get(i + 1)) {
                        values.set(i, values.get(i) * 2);
                        values.remove(i + 1);
                        done = false;
                        changes += 1;
                    }
                }
            }

            System.out.println("Middle");
            for(int i = 0; i < values.size(); i++) {
                System.out.print(values.get(i) + " ");
            }
            System.out.println();

            changes = 1;

            while(changes != 0) {
                changes = 0;
                for(int i = 1; i < values.size() - 1; i++) {
                    System.out.println("i - 1 " + values.get(i - 1));
                    System.out.println("i + 1 = " + values.get(i + 1));
                    if(values.get(i - 1) == values.get(i + 1)) {
                        System.out.println("REACHED");
                        values.remove(i + 1);
                        values.set(i - 1, values.get(i - 1) * 2 + values.get(i));
                        values.remove(i);
                        done = false;
                        changes += 1;
                    }
                }
            }

            System.out.println("Final");
            for(int i = 0; i < values.size(); i++) {
                System.out.print(values.get(i) + " ");
            }
            System.out.println();
        }

        int max = 0;

        for(int i = 0; i < values.size(); i++) {
            int check = values.get(i);
            if(check > max) {
                max = check;
            }
        }

        System.out.println(max);
    }
}

我尝试修复的代码是它所说的&#34; REACHED&#34;的部分,即使(i-1)和(i + 1)的值确实等于在控制台输出中,程序不会继续执行if语句之后的语句。我做的方式是否有错误?

仅供参考,这是我正在考虑的问题。我花了1个小时调试。

  

Alphonse有N个不同大小的饭团。他想成立   最大的饭团可供他的朋友吃。阿方斯可以   执行以下操作:

     
      
  • 如果两个相邻的饭团大小相同,Alphonse可以将它们组合成一个新的饭团。新饭团的大小是其中的总和   两个旧饭团的大小。它占据了行中的位置   以前被两个老饭团占据。
  •   
  • 如果两个饭团大小相同,并且它们之间只有一个饭团,Alphonse可以将所有三个饭团结合起来制作一个饭团   新饭团。 (中间饭团不需要相同   大小与另外两个相同。)新饭团的大小是其中的总和   三个老饭团的大小。它占据了行中的位置   以前被三个老饭团占据。阿方斯可以   根据自己的意愿多次执行每项操作。
  •   
     

确定之后最大的饭团的大小   执行0或更多操作。

     

输入规范第一行将包含整数N(1≤   N≤400)。下一行将包含N个空格分隔的整数   代表稻球的大小,从左到右依次排列。   每个整数至少为1且最多为1 000 000    - 对于15个可用标记中的1个,N = 4    - 对于15个可用标记中的另外2个,N≤10    - 对于15个可用标记中的另外5个,N≤50。

     

输出规格输出最大的饭团的大小   阿尔方斯可以形成。

2 个答案:

答案 0 :(得分:1)

尝试:

if(values.get(i - 1).equals(values.get(i + 1))) {

当你在对象上使用==(在这种情况下是整数)时,它会检查它们是否指向同一个东西,而不是它们是否实际上是相同的值。这就是.equals的用武之地。

答案 1 :(得分:0)

当你在任何arrayList上尝试get方法时,返回类型总是Object.However你可以将它转换为原始int int value = arrayList.get(index);然后你可以比较。这称为拆箱对象。请参考教程 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html