腾讯算法逻辑题
前几天小生去了一趟腾讯,接受前端大大的虐待。
整个过程充斥着各种血与泪,特别是他们的算法逻辑题,让我甚是上心。遂mark下,以求甚解...
经过一番思考以及和小伙伴们的共同探索,总算代码的运行结果是符合题目要求了,不过也不确定是否是最佳答案...
且不管了,如果知道有更好的答案再更新便是..
有人也许会说,骚年,你这样把题目发出来真的好吗?这样不担心是个人都有种去企鹅面前装13吗?
那么我可以很负责任的说,这几道题只是餐前小菜。真正的风浪在后头,假如谁天真的以为有了这几道题就稳了,小心被人当猴看。
OK,下面上正文...
/*---- 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); } function exchange () { 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(); } } var randomFlag = function () { var n = Math.floor(Math.random() * xFlag.length), curFlag = xFlag.splice(n, 1)[0]; return curFlag; } 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; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。