给定一个数组,从任意一个数字下标开始,下一个数字是当前下标加上当前下标对应的数字,加起来之后得到一个新的下标 以此计算如果能够回到最开始的下标,则该数组成环(如果下标大于数组的长度,则对数组长度取余)。 成环数组的长度必须大于1,遇到整数向后遍历,遇到负数向前遍历,并且成环的数组只允许向一个方向(成环的数组相邻的下标对应的值乘积必须大于0) 举例:
[2,1,1,2,2] 2==>1==>2==> 然后又回到第一个下标,所以该数组成环
[-1,2] -1==>2==>2... 长度为0,不成环
function circlArray(arr) {
let simpleArr = [], arrLen = arr.length;
for (let i = 0; i < arrLen; i ++) {
simpleArr.push(arr[i] % arrLen);
}
for (let i = 0; i < simpleArr.length; i ++) {
let index = i, sum = 0, temNum;
while(index < simpleArr.length) {
if (simpleArr[index] === 0) {
break;
}
if (temNum === undefined) {
temNum = simpleArr[index];
} else if (temNum * simpleArr[index] < 0) {
break;
}
sum = sum + simpleArr[index];
if (sum === simpleArr.length) {
return true;
}
index = index + simpleArr[index];
}
if (sum === simpleArr.length) {
return true;
}
}
return false;
}