22--从上往下打印出二叉树的每个节点,同层节点从左至右打印。
function PrintFromTopToBottom(root) { //广度遍历,先进先出,利用队列实现;深度遍历,后进先出,利用栈实现 var queue = []; //新建一个空队列 queue.push(root); //将二叉树的根push进队列 var result = []; //定义一个结果数组 if (root == null) { //如果二叉树不存在,直接返回result return result; } while (queue.length) { //当队列不为空的情况下 var temp = queue.shift(); //把队列中的第一个元素删除,并返回其值 result.push(temp.val); //将队列中的第一个元素push进result if (temp.left) { //根节点的左子树,push进队列 queue.push(temp.left); } if (temp.right) { //根节点的右子树,push进队列 queue.push(temp.right); } } return result; }
28--数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
function getExpend(numbers){ var mp={} for(var index in numbers){ //遍历numbers数组 if(!mp[numbers[index]]){ //如果numbers中的值不在mp中的话,将mp[numbers[index]]置为1, // 即将numbers中的value放在mp中作key使用,然后其mp中的value为对应mp中key的个数 mp[numbers[index]]=1 }else{ //如果numbers中的值在mp中的话,将mp[numbers[index]]++,即将mp中对应key的个数加1 mp[numbers[index]]++ } } for(var key in mp){ //遍历mp,mp中的key为numbers中的value,mp中的value为其个数 if(mp[key]>numbers.length/2){ return key } } return 0 } console.log(getExpend([1,2,3,2,2,2,5,4,2]))
29--输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
function GetLeastNumbers_Solution(input, k) { if(input.length < k) {
return false;
}
input.sort(function(a,b){
return a-b;
}
); return input.slice(0,k); }
33--把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
function Ugly(numbers){ //判断丑数 while(numbers){ if(numbers%5==0){ numbers/=5 }else if(numbers%3==0){ numbers/=3 }else if(numbers%2==0){ numbers/=2 }else if(numbers==1){ return true }else{ //这里,表明除完5、3、2后剩下的因子不为1,则表示还有其他因子存在,因此,不是丑数 return false } } } function getNUgly(n){ var count=1 //用来统计第几个丑数 var num = 1 //用来表示第几个丑数对应的值 while(count<=n){ if(Ugly(num++)){ count++; } } return --num } console.log(getNUgly(7))
34--在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置
function FirstNotRepeatingChar(str) { // write code here var mp = {} for (var index in str) { //遍历numbers数组 if (!mp[str[index]]) { //如果numbers中的值不在mp中的话,将mp[numbers[index]]置为1, // 即将numbers中的value放在mp中作key使用,然后其mp中的value为对应mp中key的个数 mp[str[index]] = 1 } else { //如果numbers中的值在mp中的话,将mp[numbers[index]]++,即将mp中对应key的个数加1 mp[str[index]]++ } } for(var index in str){ if(mp[str[index]]==1){ return index; } } return -1; }
37--统计一个数字在排序数组中出现的次数。
function getCount(arr,k){ var mp={}; //定义一个mp对象 for(var index in arr){ //遍历arr,若arr中的数据不在mp中,则将其放进mp中,mp中其对应value为1 if(!mp[arr[index]]){ mp[arr[index]]=1; }else{ mp[arr[index]]++; //遍历arr,若arr中的数据在mp中,则将其放进mp中,mp中其对应value加1,该值对应的个数 } } return mp[k]?mp[k]:0 //存在k返回个数,不存在则返回0 } console.log(getCount([1,3,5,6,7,8,3,8,8],8)); console.log(getCount([1,3,5,6,7,8,3,8,8]s,9));
40--一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
function searchNum(data){ var mp={}; for(var index in data){ if(!mp[data[index]]){ mp[data[index]]=1; }else{ mp[data[index]]++ } } var arr=[]; for(var key in mp){ //将个数为1的元素存在一个数组中,并返回即可 if(mp[key]==1){ arr.push(key) //console.log(key); } } return arr; } console.log(searchNum([1,2,3,4,5,4,5,3,6,6]));
42--输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
function FindNumbersWithSum(array, sum) { var len=array.length; var begin=0; var end=len-1; var s =Math.pow(2,31) var beginmin = 0 var endmin=0 while(begin<end){ //前后一起推进,计算,大于sum,end向前,小于sum,begin向后 if(array[begin]+array[end]>sum){ end--; }else if(array[begin]+array[end]<sum){ begin++; }else{ //找到一对,继续遍历,看是否还存在满足条件的 if(s>array[begin]*array[end]){ s=array[begin]*array[end] beginmin = array[begin] endmin=array[end] } begin++; end--; } } if(s == Math.pow(2,31)){ //这里s值没变,即表示没有找到满足条件的,返回空 return [] } return [beginmin,endmin] }