一些算法逻辑题

对于这些题目...(以下省略一万字...)

关于题目的答案,我只给了源码,没给注释。

因为很多问题知道答案没实质意义,了解思路才是王道。

SO~~修行看个人吧,思路还是自己琢磨出来的才有价值...

我强烈建议看到这些题目的人,先自己思考一番再看答案。

先上题目:

1.52张牌,通过洗牌使每张牌的位置都不在原来的位置上,要求尽量让牌洗得均匀

2.现在有一个函数Rand5()可以等概率生成[0,5)的随机整数,先要求在仅依赖此函数的基础下,写一个Rand3()函数,等概率生成[0,3)的随机整数

3.数组a[N],存放了数字1至N-1,其中某个数字重复出现了一次,要求写一函数find(arr),找出该数字,时间复杂度必须为O(N),空间复杂度不能是O[N]

4.判断正整数是否是对称数,例如121,2442等等,不能把整数转成字符串做判断

5.给定一个整数,按10进制来看,计算里面包含多少个0,不能将数字转成字符串

6.有一个二叉树,每个节点的值是一个整数。写一个函数,判断这棵树中是否存在从根到叶子节点的一个路径,这个路径上所有的节点的值之和为某一个值。存在则返回1,否则返回0。

再上答案:

    /*---- 52张牌,通过洗牌使每张牌的位置都不在原来的位置上,要求尽量让牌洗得均匀 ----*/
    var poker = ['a1','a2','a3','a4','b1','b2','b3','b4']; //这里应该有52张,但为了不让小手受虐,只模拟了8张...

    function wash(poker) {
        var xFlag = [];

        for (var i = 0,len = poker.length; i < len; i++) {
            xFlag.push(i);
        }

        var randomFlag = function () {
            var n = Math.floor(Math.random() * xFlag.length),
                curFlag = xFlag.splice(n, 1)[0];
            return curFlag;
        }

        var exchange = function () {
            var flag_a = randomFlag(),
                flag_b = randomFlag(),
                p_a = poker[flag_a],
                p_b = poker[flag_b];

            poker.splice(flag_a, 1, p_b);
            poker.splice(flag_b, 1, p_a);

            while (xFlag.length != 0) {
                exchange();
            }
        }

        exchange();

        return poker;
    }

    /*---- 现在有一个函数Rand5()可以等概率生成[0,5)的随机整数,先要求在仅依赖此函数的基础下,写一个Rand3()函数,等概率生成[0,3)的随机整数 ----*/
    function rand5 () {
        return Math.floor(Math.random() * 5);
    }

    function rand3 () {
        var i;

        do {
            i = rand5();
        } while (i >= 3)

        return i;
    }

    /*---- 数组a[N],存放了数字1至N-1,其中某个数字重复出现了一次,要求写一函数find(arr),找出该数字,时间复杂度必须为O(N),空间复杂度不能是O[N] ----*/
    var arr = [1,5,8,9,4,6,2,3,7,9]; //这里模拟了一个题目中描述的数组

    function find (arr) {
        var len = arr.length,
            sum_a = (1 + len) * (len / 2),
            sum_b = 0;

        for (var i = 0; i < len; i++) {
            sum_b += arr[i];
        }

        return len - (sum_a - sum_b);
    }

    /*---- 判断正整数是否是对称数,不能把整数转成字符串做判断 ----*/
    function countNunLength (num) {
        var result = 0;
        while (num > 1) {
            num = num / 10;
            result++;
        }
        return result;
    }

    function isSimNum (num) {
        if (countNunLength(num) == 1) return true;

        while (countNunLength(num) > 1) {
            var len = countNunLength(num),
                num_l = Math.floor(num / Math.pow(10, len - 1)),
                num_r = num % 10;

            if (num_l != num_r) {
                return false;
            }

            num = Math.floor((num - num_l * Math.pow(10, len - 1)) / 10);
        }

        return true;
    }

    /*---- 给定一个整数,按10进制来看,计算里面包含多少个0,不能将数字转成字符串 ----*/
    function count_O (num) {
        var result = 0;
        while (num > 10) {
            if (num % 10 == 0) {
                result++;
            }
            num = Math.floor(num / 10);
        }
        return result;
    }

    /*---- 有一个二叉树,每个节点的值是一个整数。写一个函数,判断这棵树中是否存在从根到叶子节点的一个路径,这个路径上所有的节点的值之和为某一个值。存在则返回1,否则返回0 ----*/
    //要做题,先造树...
    var tree = {
        value : 10,
        nodes : [
            {
                value : 10,
                nodes : []
            },
            {
                value : 10,
                nodes : [
                    {
                        value : 10,
                        nodes : [
                            {
                                value : 40,
                                nodes : []
                            },
                            {
                                value : 50,
                                nodes : []
                            }
                        ]
                    },
                    {
                        value : 20,
                        nodes : []
                    }
                ]
            }
        ]
    }

    function checkTree (treeNode, compareNum) {
        var result = false;

        var checkNode = function (treeNode, compareNum, lastSumNum) {
            if (treeNode.nodes.length > 0) {
                for (var i = 0, len = treeNode.nodes.length; i < len; i++) {
                    checkNode(treeNode.nodes[i], compareNum, lastSumNum + treeNode.value);
                }
            } else {
                if (lastSumNum + treeNode.value == compareNum) {
                    result = true;
                }
            }
        }

        checkNode(treeNode, compareNum, 0);

        return result;
    }
原文地址:https://www.cnblogs.com/czf-zone/p/4353278.html