[LinkedIn] Reversed Nested Integer
/**
* 这道题我加了个变形,reversed的
* Given a nested list of integers, returns the sum of all integers in the list weighted by their depth
* For example, given the list {{1,1},2,{1,1}} the function should return 10 (four 1’s at depth 1, one 2 at depth 2)
* Given the list {1,{4,{6}}} the function should return 27 (one 1 at depth 3, one 4 at depth 2, one 6 at depth 1)
*/
/**
* This is the interface that represents nested lists.
* You should not implement it, or speculate about its implementation.
*/
public interface NestedInteger
{
// Returns true if this NestedInteger holds a single integer, rather than a nested list
public boolean isInteger();
// Returns the single integer that this NestedInteger holds, if it holds a single integer
// Returns null if this NestedInteger holds a nested list
public Integer getInteger();
// Returns the nested list that this NestedInteger holds, if it holds a nested list
// Returns null if this NestedInteger holds a single integer
public List getList();
}
解答
int calWeightedSum(MyNestedInteger ni) {
if(ni == null) {
return 0;
}
else {
if(ni.isInteger()) {
return ni.getInteger()
} else {
int depth = ni.getDepth(ni.getList());
getListSum(ni.getList(), depth);
}
}
}
int getListSum(List<MyNestedInteger> li, int curDepth) {
int ret = 0;
for(MyNestedInteger ni : li) {
if(ni.isInteger()) {
ret += ni.getInteger() * curDepth;
} else {
ret += getListSum(ni.getList(), curDepth-1);
}
}
return ret;
}
int getDepth(List<MyNestedInteger> li) {
int greatestDepth = 0;
for(MyNestedInteger ni : li) {
if(ni.isInteger()) {
if(greatestDepth < 1) {
greatestDepth = 1;
}
} else {
int d = getDepth(li.getList());
if(greatestDepth < d){
greatestDepth = d;
}
}
}
return greatestDepth;
}