• 一些算法逻辑题


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

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

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

    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;
        }
  • 相关阅读:
    【HDOJ4812】D Tree(点分治)
    【POJ1741】Tree(点分治)
    点分治模板
    【ZJOI2017 Round1练习】D4T2 trie(贪心,状压DP)
    【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)
    【ZJOI2017 Round1练习&BZOJ4773】D3T1 cycle(最小负环,倍增)
    【ZJOI2017 Round1练习&BZOJ5350】D5T1 masodik(DP,斜率优化)
    【SGU194&ZOJ2314】Reactor Cooling(有上下界的网络流)
    【HDOJ4322】Candy(费用流)
    jstl_fn方法库
  • 原文地址:https://www.cnblogs.com/czf-zone/p/4353278.html
Copyright © 2020-2023  润新知