说我有一个[5,4,0,3,1,6,2]数组。我在索引0处获取第一个元素,其值为5。接下来,我想找到索引为5的元素,该元素对应于值6。然后,我想在索引6处查找该值,即是2,则2点等于0,我们回到起点,所以我们停了下来。
我需要根据索引值来喜欢“链”元素,并在我的数组中找到链的长度。在我给定的示例中为4。我该怎么做?我觉得这里缺少一些简单的东西。
答案 0 :(得分:1)
您可以决定从哪里开始(在这种情况下,索引为零),然后设置一个while循环,该循环打印当前值,然后将当前值设置为该索引处的数组查找。当数组查找返回undefined
时停止。如果需要计数,可以在循环时维护一个计数器变量:
let arr = [5,4,0,3,1,6,2]
let start = arr[0]
let seen = new Set();
let count = 0
while (start != undefined && !seen.has(start)){
console.log(start)
seen.add(start)
count++
start = arr[start]
}
console.log("Count:", count)
您还可以保留一组访问索引,以帮助避免周期。在这种情况下,如果您从索引1开始,它将在1到4之间跳动。
答案 1 :(得分:0)
一个选项是do/while
循环,该循环不断重新分配一个nextIndex
变量,一旦找到重复的nextIndex
或一旦nextIndex
超出范围,该变量就会中断的数组:
const arr = [5, 4, 9, 3, 1, 6, 2];
let count = 0;
let nextIndex = 0;
const usedIndicies = new Set();
do {
usedIndicies.add(nextIndex);
nextIndex = arr[nextIndex];
count++;
} while (!usedIndicies.has(nextIndex) && nextIndex < arr.length);
console.log(count);
答案 2 :(得分:0)
您也可以通过单个Array.reduce解决此问题:
let arr = [5,4,0,3,1,6,2]
let result = arr.reduce((acc, cur, indx, arr) => {
let last = acc[acc.length-1]
!indx ? acc.push(cur) : !last ? null : acc.push(arr[last])
return acc
}, [])
console.log('result: ', result, 'count: ', result.length)
要进一步简化,您可以始终从accumulator array
中的 first 元素开始:
let arr = [5,4,0,3,1,6,2]
let result = arr.reduce((acc, cur, _, arr) => {
let last = acc[acc.length - 1]
last ? acc.push(arr[last]) : null
return acc
}, [arr[0]])
console.log('result: ', result, 'count: ', result.length)
如果需要的话,还可以将其一行作为:
let arr = [5,4,0,3,1,6,2]
let r = arr.reduce((r, c, _, a) =>
(r[r.length-1] ? r.push(a[r[r.length-1]]) : null, r), [arr[0]])
console.log('result: ', r, 'count: ', r.length)