给定(10(5(3)(12))(14(11)(17)))
类型的输入
哪个代表以下树
n=0 10
n=1 5 14
n=2 3 12 11 17
我的任务是找到特定等级的值的总和(5+14=19
,即n=1
的总和,3+12+11+17=43
的总和n=2
。
var input =
"(10(5(3)(12))(14(11)(17)))";
function stripFirstLastParen(input){
if(input[0] !== "(" || input[input.length - 1] !== ")"){
console.error("unbalanced parens")
}
else{
input = input.substr(1);
input = input.substring(0, input.length - 1);
}
return input;
}
function getCurrentVal(input){
var val = "";
while(input[0] !== "(" && input[0] !== ")" && input.length){
val += input[0];
input = input.substr(1);
}
return {
val,
input
}
}
function getChildren(input){
var val = "";
if(input.length == 0){
return {
left: "",
right: ""
}
}
if(input[0] !== "("){
console.error("no open paren at start");
}
val += input[0];
input = input.substr(1);
var parenStack = 1;
while(parenStack > 0){
if(input[0] == ")"){
parenStack--;
}
else if(input[0] == "("){
parenStack++;
}
val += input[0];
input = input.substr(1);
}
return {
left: val,
right: input
}
}
function getValueForLevel(input, k){
var totalValue = 0;
input = stripFirstLastParen(input);
var currentValue = getCurrentVal(input);
var children = getChildren(currentValue.input);
if(k > 0){
if(children.left.length){
totalValue += getValueForLevel(children.left, k-1);
}
if(children.right.length){
totalValue += getValueForLevel(children.right, k-1);
}
}
else if(k == 0){
totalValue += JSON.parse(currentValue.val);
}
return totalValue;
}
var test = getValueForLevel(input, 2);
console.log(test);

我的关注主要在于如何进行字符串操作:stripFirstLastParen
将删除第一个和最后一个paren,getCurrentVal
在读取时删除该值。
这是一次采访练习,我想填补我的知识空白:
我确实理解读取应该是非破坏性的操作(即获取节点的当前值不应该从输入字符串中删除它)。在这个例子中,是否值得分离关注点(单独读取和更改输入字符串),还是会增加开销的复杂性?另外迭代字符串可能被认为是不利的(解析一次,第二次删除读取值)。
我无法想到"为什么你的阅读功能应该是idempotent"除了一般测试/可用性之外,在这里是幂等的重要性,还是可以随意地在地毯下扫描(假设这是一个练习)?