数组下标成环问题

263 阅读1分钟

给定一个数组,从任意一个数字下标开始,下一个数字是当前下标加上当前下标对应的数字,加起来之后得到一个新的下标 以此计算如果能够回到最开始的下标,则该数组成环(如果下标大于数组的长度,则对数组长度取余)。 成环数组的长度必须大于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;
}