967.连续差相同的数字(使用JavaScript解答,迭代 BFS广度优先算法回顾)

Posted JIZQAQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了967.连续差相同的数字(使用JavaScript解答,迭代 BFS广度优先算法回顾)相关的知识,希望对你有一定的参考价值。

题干:

返回所有长度为 n 且满足其每两个连续位上的数字之间的差的绝对值为 k 的 非负整数 。

请注意,除了 数字 0 本身之外,答案中的每个数字都 不能 有前导零。例如,01 有一个前导零,所以是无效的;但 0 是有效的。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 3, k = 7
输出:[181,292,707,818,929]
解释:注意,070 不是一个有效的数字,因为它有前导零。
示例 2:

输入:n = 2, k = 1
输出:[10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]
示例 3:

输入:n = 2, k = 0
输出:[11,22,33,44,55,66,77,88,99]
示例 4:

输入:n = 2, k = 2
输出:[13,20,24,31,35,42,46,53,57,64,68,75,79,86,97]
 

提示:

2 <= n <= 9
0 <= k <= 9

标准错误答案:

/**
 * @param {number} n
 * @param {number} k
 * @return {number[]}
 */
var numsSameConsecDiff = function(n, k) {
        var list = [];
        for (var i=1;i<10;i++){//第一位数字范围为1-9
            var num = String(i);
            for(var j=0;j<n;j++){//长度为n
                //获得上一项数字
                var lastItem = num.charAt(num.length - 1);
                for(var m=0;m<10;m++){//第二位开始范围为0-9
                    if(Math.abs(m-lastItem) == k){
                        num = num + String(m);
                    }
                }
                //如果num有n位则输出
                if(num.length == n){
                    list.push(num);
                }
            }
        }
        return list;
    };

输入:

2 1

输出:

[98]

预期结果:

[10,12,21,23,32,34,43,45,54,56,65,67,76,78,87,89,98]

 

反思:

第三个for的时候有可能不止1个答案,我全加到num后面明显是不对的,第一次刷leetCode太天真了,明明是算法题。回忆了一下大学时候的课,感觉应该要用到迭代或者递归的办法,于是重写了这题…

 

迭代写法(正解):使用.map().

先来回顾一下什么是BFS

BFS 广度优先搜索是指,立足于当前的某一个节点,每一次将遍历所有离该节点最近的节点(也就是距离为1的节点),然后再将这些刚刚被当作最近节点遍历的节点全部依次作为当前节点进行下一次对所有最近节点的遍历,依次类推,直到找到想要的节点和路径。

思路解析

那么对应到这道题目来说,我们最先需要“立足的某一个节点”,就是我们需要返回的n位数字的第一位数字。而作为一个n位数字的首位,是不可以为0的,于是我建立一个list将数字1到9放了进去。每一个数字都是一个起点。

然后,依次寻找符合要求的第二位数字,并且将符合要求的第二位数字与首位拼接,插入到一个新的list当中去。再不断这样做,去寻找下一位,直到拼接的数字长度达到要求的n位。

在控制他达到n位停止继续搜寻,我使用了一个循环,由于我首位在循环前已经插入,所以总的循环次数为n-1次。

如果输入n=3,k=7的话,控制台输出的应该是:

list :18,29,70,81,92
list :181,292,707,818,929

LeetCode跑出来的数据:

执行用时:88 ms, 在所有 javascript 提交中击败了89.19%的用户

内存消耗:40.3 MB, 在所有 JavaScript 提交中击败了10.81%的用户

LeetCode提交的代码

/**
 * @param {number} n
 * @param {number} k
 * @return {number[]}
 */
var numsSameConsecDiff = function(n, k) {
        var list = [1,2,3,4,5,6,7,8,9];//可能存在的第一位数字;第一位数字范围为1-9
        for(var i=1;i<n;i++){//总共位数为n,但是循环n-1次,因为第一位已经塞到list里面了
            var tempList = [];
            list.map(f => {
                //获得上一项数字
                var lastItem = String(f).charAt(f.length - 1);
                //第二位开始范围为0-9
                var array = [0,1,2,3,4,5,6,7,8,9];
                array.map(e => {
                    if(Math.abs(e-lastItem) == k){
                        var tempNum = String(f) + String(e);
                        tempList.push(tempNum);
                    }
                });
            });
            list = tempList;
            console.log("list :"+list);
        }
        return list;
    }

 

以上是关于967.连续差相同的数字(使用JavaScript解答,迭代 BFS广度优先算法回顾)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-967 Numbers With Same Consecutive Differences(连续差相同的数字)

连续数字之和 JavaScript

javascript 连续判断字符

JavaScript中Number数字数值浮点运算有误差

js验证连续两位数字递增或递减和连续三位数字相同

在列表中找到相同数字的最大连续出现而不导入任何模块