首页 > 解决方案 > 使用 java 挑战问题在森林中查找和格式化视觉上美观的树木图案

问题描述

最近面临一个有上述问题的面试代码挑战。有一个人拥有他的森林,树木以行的形式种植。每行都应以视觉上令人愉悦的方式包含一棵树。例如。如上图所示:

图像1

图2

上面的树形图案在视觉上永远不会令人愉悦: image3

这里每列代表行中的树及其高度。没有两棵彼此相邻的树应该具有相同的高度,以使行在视觉上美观。农场主希望所有的树木都具有视觉美感。为此,他最多可以连续砍一棵树。找出可以连续切割一棵树的方法数量,以使一排树美观。

即使某行已经在视觉上美观,也返回 0 作为函数的输出。

否则,即使在砍掉任何一棵树之后,行也永远无法形成视觉上美观的图案;那么函数应该返回-1。

例如:A[] = {3, 4, 5, 3, 7}; 那么它可以通过 3 种方式在视觉上美观:remove 3, A[] = {4, 5, 3, 7} else remove 4, A[] = {3, 5, 3, 7} else remove 5, A[ ] = {3, 4, 3, 7} 所以函数应该返回 3。

G。B[] = {1, 2, 3, 4, 2, 5}; 这种模式永远不可能在视觉上美观,所以函数应该返回-1。

例如。c[] = {1, 3, 1, 2}; 这种模式在视觉上已经很美观了,所以它应该返回 0。

我试图解决它,如下一个解决方案部分所示。有人可以建议更多更好的方法来解决问题以降低代码复杂性并更快地使用 java 吗?

标签: javaperformancecorrectness

解决方案


下面是我的代码。如果下面还有任何问题,请纠正我。

public int solution(int[] A) {

    int count = 0;
    List<Integer> arr = new ArrayList<Integer>();

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

    for (int i : A) {
        arr.add(i);
    }

    // first check if its already in correct sequence
    boolean check = false;
    for (int j = 0; j < A.length-2 ; j++) {
        if ((arr.get(j) - arr.get(j + 1) > 0) && (arr.get(j + 1) - arr.get(j + 2) < 0)) {
            check = true;
        } else if ((arr.get(j) - arr.get(j + 1) < 0) && (arr.get(j + 1) - arr.get(j + 2) > 0)) {
            check = true;
        } else {
            check = false;
            break;
        }
    }
    if (check) {
        return 0;
    }

    List<Integer> ab = new ArrayList<Integer>();

    for (int i = 0; i < A.length; i++) {
        ab.clear();
        ab.addAll(arr);
        ab.remove(i);
        int f = 0;
        boolean okay = false;
        while (f < A.length - 3) {
            if (!okay && f != 0) {
                break;
            }
            if ((ab.get(f) - ab.get(f + 1) > 0) && (ab.get(f + 1) - ab.get(f + 2) < 0)) {
                okay = true;
            } else if ((ab.get(f) - ab.get(f + 1) < 0) && (ab.get(f + 1) - ab.get(f + 2) > 0)) {
                okay = true;
            } else {
                okay = false;
            }
            f++;
        }
        if (okay) {
            count++;
        }
    }
    if (count == 0)
        count = -1;

    return count;
}

推荐阅读