资讯专栏INFORMATION COLUMN

js实现螺旋矩阵算法

oogh / 1932人阅读

摘要:用填充一个的矩阵,该矩阵按顺时针旋转方向依次增大,用编程输出这个数组。要求如下我的思路先生成一个一维的数组这里实现的算法是通过略微修改了然后通过算法实现变化对应赋值方式有点蠢,通过实现还有有所收获的完整

Q:用0-9填充一个N*N的矩阵,该矩阵按顺时针旋转方向依次增大,用js编程输出这个数组。要求如下:

我的思路先生成一个一维的数组;

这里实现的算法是通过略微修改了d3.range();

function range_(start, stop, step) {
        if (arguments.length < 3) {
            step = 1;
            if (arguments.length < 2) {
                stop = start;
                start = 0;
            }
        }
        if ((stop - start) / step === Infinity) throw new Error("infinite range");
        var range = [],
            k = range_integerScale(Math.abs(step)),
            i = -1,
            j;
        start *= k, stop *= k, step *= k;
        if (step < 0)
            while ((j = start + step * ++i) > stop) range.push(range_interger_10(j / k));
        else
            while ((j = start + step * ++i) < stop) range.push(range_interger_10(j / k));
        return range;
    };

    function range_integerScale(x) {
        var k = 1;
        while (x * k % 1) k *= 10;
        return k;
    }

    function range_interger_10(a) {
        a = a >= 10 ? range_interger_10(a % 10) : a;
        return a;
    }

然后通过算法实现index变化;对应赋值;方式有点蠢,通过实现还有有所收获的;

var c = {
        "index": 1,
        "fuhao": -1
    }
    var r = {
        "index": 1,
        "fuhao": -1
    }
    var step = n - 1;
    var jo = 0;
    var i = 1;
    var _ = 0;
    var direction = {
        0: function() {
            c["fuhao"] = -Math.abs(c["fuhao"])
            return c
        },
        1: function() {
            r["fuhao"] = -Math.abs(r["fuhao"])
            return r
        },
        2: function() {
            c["fuhao"] = Math.abs(c["fuhao"])
            return c
        },
        3: function() {
            r["fuhao"] = Math.abs(r["fuhao"])
            return r
        }
    }
    var cishu = 0;
    while (i <= cell.length) {

        arr[r["index"] - 1][c["index"] - 1] = cell[i - 1];

        var step_num = Math.floor((i - 1) / ((n - 1) * 3)) == 0 ? 3 : 2;

        if (i - jo <= step) {

            var s = direction[_ % 4]();

            
            s["index"] = s["index"] - s["fuhao"]

            if (i - jo == step) {

                _++;

                jo = i;

                cishu++;

                if (cishu == step_num) {

                    step--;
                    cishu = 0
                }
            }
        }

        i++
    }

完整code

function circleNum(n) {
    var arr = new Array(n);
    for (var i = 0; i < arr.length; i++) {
        arr[i] = new Array(n);
    };
    //
    var length = n * n;
    var cell = range_(length)
    console.log(cell)
    var c = {
        "index": 1,
        "fuhao": -1
    }
    var r = {
        "index": 1,
        "fuhao": -1
    }
    var step = n - 1;
    var jo = 0;
    var i = 1;
    var _ = 0;
    var direction = {
        0: function() {
            c["fuhao"] = -Math.abs(c["fuhao"])
            return c
        },
        1: function() {
            r["fuhao"] = -Math.abs(r["fuhao"])
            return r
        },
        2: function() {
            c["fuhao"] = Math.abs(c["fuhao"])
            return c
        },
        3: function() {
            r["fuhao"] = Math.abs(r["fuhao"])
            return r
        }
    }

    var cishu = 0;

    while (i <= cell.length) {

        arr[r["index"] - 1][c["index"] - 1] = cell[i - 1];

        var step_num = Math.floor((i - 1) / ((n - 1) * 3)) == 0 ? 3 : 2;

        if (i - jo <= step) {

            var s = direction[_ % 4]();

            
            s["index"] = s["index"] - s["fuhao"]

            if (i - jo == step) {

                _++;

                jo = i;

                cishu++;

                if (cishu == step_num) {

                    step--;
                    cishu = 0
                }
            }
        }

        i++
    }

    function range_(start, stop, step) {
        if (arguments.length < 3) {
            step = 1;
            if (arguments.length < 2) {
                stop = start;
                start = 0;
            }
        }
        if ((stop - start) / step === Infinity) throw new Error("infinite range");
        var range = [],
            k = range_integerScale(Math.abs(step)),
            i = -1,
            j;
        start *= k, stop *= k, step *= k;
        if (step < 0)
            while ((j = start + step * ++i) > stop) range.push(range_interger_10(j / k));
        else
            while ((j = start + step * ++i) < stop) range.push(range_interger_10(j / k));
        return range;
    };

    function range_integerScale(x) {
        var k = 1;
        while (x * k % 1) k *= 10;
        return k;
    }

    function range_interger_10(a) {
        a = a >= 10 ? range_interger_10(a % 10) : a;
        return a;
    }
    for (var ii = 0; ii < n; ii++) {
        console.log(arr[ii])
    }
    return arr;
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87074.html

相关文章

  • js实现螺旋矩阵算法

    摘要:用填充一个的矩阵,该矩阵按顺时针旋转方向依次增大,用编程输出这个数组。个人觉得这个思路不是最优解,各位路过的高手如果有更好思路,望不吝赐教。请输入代码此处可给赋值即可,比如生成矩阵,就等于 Q:用0-9填充一个N*N的矩阵,该矩阵按顺时针旋转方向依次增大,用js编程输出这个数组。要求如下:showImg(https://segmentfault.com/img/bVJ5Uf?w=210...

    bbbbbb 评论0 收藏0
  • Leetcode 54:Spiral Matrix 螺旋矩阵

    摘要:螺旋矩阵给定一个包含个元素的矩阵行列,请按照顺时针螺旋顺序,返回矩阵中的所有元素。每次转向或都会自减。循环可操作性很高,可以直接操作索引坐标改变遍历方式,不再赘述。 54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix i...

    venmos 评论0 收藏0
  • Leetcode 54:Spiral Matrix 螺旋矩阵

    摘要:螺旋矩阵给定一个包含个元素的矩阵行列,请按照顺时针螺旋顺序,返回矩阵中的所有元素。每次转向或都会自减。循环可操作性很高,可以直接操作索引坐标改变遍历方式,不再赘述。 54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix i...

    mochixuan 评论0 收藏0
  • 6-9月技术文章汇总

    摘要:分布式的管理和当我在谈论架构时我在谈啥状态码详解无状态协议和请求支持哪些方法分层协议栈有哪些数据结构运用场景说说你常用的命令为什么要有包装类面向对象的特征是啥是啥有什么好处系统设计工程在线诊断系统设计与实现索引背后的数据结构及算法原理软技能 HTTP 【HTTP】分布式session的管理 【HTTP】Cookie和Session 【HTTP】当我在谈论RestFul架构时我在谈啥?...

    miya 评论0 收藏0
  • [Leetcode] Spiral Matrix 螺旋矩阵

    摘要:代码添加该圈第一行添加最后一列添加最后一行添加第一列如果是奇数,加上中间那个点后续如果在中,给出的是和来代表行数和列数,该如何解决和的本质区别就是一个是任意长方形,一个是正方形,所以中不需要判断最后一行或者最后一列。 Spiral Matrix I Given a matrix of m x n elements (m rows, n columns), return all ele...

    waruqi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<