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})); } }
浙公网安备 33010602011771号