2018届春招阿里巴巴实习生招聘内推编程题

对于一个由一位十进制整数构成的二叉树,如果深度不超过4,可以用一个三位十进制整数构成的数组表示,具体规则如下:

1、百位数表示树的层次L,1<=L<=4;十位数表示在该层次中的位置P,1<=P<=8;个位数表示数值V。

2、数组里,L一定是单增的,也就是说后一个数的L大于等于前一个数的L;

3、对于同一个L,P也是单增的,就是说在L不变的情况下,后一个数的P大于等于前一个数的P。

 

例如:[ 113, 215, 221 ]

      3

    /    \

 5       1

现在要求这个树所有到叶子节点的路径和,对于例子中,路径和为 (3+5)+(3+1)=12

以空间换时间,话不多说,直接看代码。。

import org.junit.Test;

/*
 * @company    sinobest
 * @date    2017-8-1
 * @author    oudongqi
 */

/**
 * 
 对于一个由一位十进制整数构成的二叉树,如果深度不超过4,可以用一个三位十进制整数构成的数组表示,具体规则如下:
 * 
 * 1、百位数表示树的层次L,1<=L<=4;十位数表示在该层次中的位置P,1<=P<=8;个位数表示数值V。
 * 
 * 2、数组里,L一定是单增的,也就是说后一个数的L大于等于前一个数的L;
 * 
 * 3、对于同一个L,P也是单增的,就是说在L不变的情况下,后一个数的P大于等于前一个数的P。
 * 
 * 
 * 例如:[ 113, 215, 221 ]
 * 
 * 3
 * 
 * / \
 * 
 * 5 1
 * 
 * 现在要求这个树所有到叶子节点的路径和,对于例子中,路径和为 (3+5)+(3+1)=12
 * 
 * @author oudongqi
 * @date 2017-8-1
 */
public class TestLPV {
    public int caculator(int[] tree) {
        if (tree.length == 1) {
            return tree[0] % 10;
        }
        if (tree.length == 2) {
            return tree[0] % 10 + tree[1] % 10;
        }
        int[] l = new int[tree.length];
        int[] p = new int[tree.length];
        int[] v = new int[tree.length];

        for (int i = 0; i < tree.length; i++) {
            //层次
            l[i] = tree[i] / 100;
            //数值
            v[i] = tree[i] % 10;
        }
        //结果变量
        int result = v[0] + v[1];
        
        for (int i = 2; i < l.length; i++) {
            if (l[i] > l[i - 1]) {
                result = result + v[i];
            } else if (l[i] == l[i - 1]) {
                // 左节点
                if (i % 2 == 1) {
                    result = result + v[i];
                } else {
                    // 右节点,当新枝处理
                    result += newBranch(i, v) + v[i];
                }
            } else {
            }
        }
        return result;
    }

    public int newBranch(int i, int[] v) {
        int parentIndex = (i - 1) / 2;
        if (parentIndex == 0) {
            return v[parentIndex];
        }
        return v[parentIndex] + newBranch(parentIndex, v);
    }

    @Test
    public void test() {
        //113, 215, 221, 312, 324, 336
        System.out
                .println(caculator(new int[] { 113,215 ,221,312,324}));
    }
}

 

posted on 2017-08-01 17:25  monster_101  阅读(1086)  评论(0)    收藏  举报