我有以下Q& A流程:
基本思想是,根据为问题选择的答案,接下来会问一个不同的问题。
我目前使用以下JavaScript对象代表此Q& A流程:
var QAndAObj = {
1: {
question: 'Question 1',
answers: [
{
answerText: 'Answer 1-1',
nextQuestion: 2
},
{
answerText: 'Answer 1-2',
nextQuestion: 3
}
]
},
2: {
question: 'Question 2',
answers: [
{
answerText: 'Answer 2-1',
nextQuestion: 3
},
{
answerText: 'Answer 2-2',
nextQuestion: null
}
]
},
3: {
question: 'Question 3',
answers: [
{
answerText: 'Answer 3-1',
nextQuestion: 4
},
{
answerText: 'Answer 3-2',
nextQuestion: null
},
{
answerText: 'Answer 3-3',
nextQuestion: null
}
]
},
4: {
question: 'Question 4',
answers: [
{
answerText: 'Answer 4-1',
nextQuestion: null
},
{
answerText: 'Answer 4-2',
nextQuestion: null
}
]
}
};
为了向用户显示进度条,我希望能够计算问题流程中的最长和最短路径。
我最初的想法是编写一个像下面这样的递归函数来记录流程中的每个可能路径:
function recurse(node) {
for (var i = 0; i < node.answers.length; i++) {
if (node.answers[i].nextQuestion) {
recurse(QAndAObj[node.answers[i].nextQuestion]);
}
}
}
上面的函数允许我命中流中的每个节点,但我不知道如何计算流中最长和最短的路径。
非常感谢任何帮助/建议/代码 非常感谢你。
答案 0 :(得分:2)
看一下这个jsFiddle的实例。
function shortAndLong(QATree, startNode) {
var paths = [];
function findAllPaths(startNode, currentCost) {
for (var i = 0; i < startNode.answers.length; i++) {
var child = startNode.answers[i];
if (child.nextQuestion == null) {
paths.push(currentCost);
}else {
findAllPaths(QATree[child.nextQuestion], currentCost+1);
}
}
}
findAllPaths(startNode, 1);
return [Math.min.apply(Math, paths), Math.max.apply(Math, paths)]
}
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[1]));//returns [2, 4]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[2]));//returns [1, 3]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[3]));//returns [1, 2]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[4]));//returns [1, 1]
基础是
答案 1 :(得分:0)
var lengthLongestPath = function(input) {
let maxLength = 0;
let pathLength = { 0: 0 }
let lines = input.split("\n");
for (let i = 0; i < lines.length; i++) {
let name = lines[i].replace(/\t/g,"");
let depth = lines[i].length - name.length;
if (name.includes(".")) {
maxLength = Math.max(maxLength, pathLength[depth] + name.length);
} else {
pathLength[depth + 1] = pathLength[depth] + name.length + 1;
}
}
return maxLength;
};
console.log(lengthLongestPath("dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"))