一些算法逻辑题
对于这些题目...(以下省略一万字...)
关于题目的答案,我只给了源码,没给注释。
因为很多问题知道答案没实质意义,了解思路才是王道。
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; }