腾讯4月3号笔试:完全二叉排序树

记不清题目了。依稀记得题目中说高度为k的完全二叉排序树的节点个数是2^k - 1。但是,完全二叉树可以不是满的啊?还是说这里要求此题中二叉树就得是满的。
当时在这个问题上纠结了很久,现在感觉很不必要。
然后,做法就是二分了。你们的做法呢?
后来写了下,如下:
int solve(vector<int> &vec, vector<int> &nums, int left, int right) {
    int index = (left+right)%2 == 0 ? (left+right)/2 : (left+right)/2+1;
    int root = vec[index];
    int res = 0;
    if (nums[2] < root) res = solve(vec, nums, left, index-1);
    else if (nums[0] > root) res = solve(vec, nums, index+1, right);
    else return root;
    return res;
}
int main()
{
    int k, a, b, c;    // 这里的k是k个节点了, 不是题目中的高度,反正思路是这样把。
    while (cin >> k >> a >> b >> c) {
        vector<int> vec(k, 0);
        for (int i = 0; i < k; i++) {
            vec[i] = i+1;
        }
        vector<int> nums{a, b, c};
        sort(nums.begin(), nums.end());
        cout << solve(vec, nums, 0, k-1) << endl;
    }
    return 0;
}
腾讯啊。#腾讯##C++工程师#
全部评论
题目说了满
点赞
送花
回复
分享
发布于 2017-04-04 16:58
#include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; int res(int sum,int num1,int num2,int num3,int temp) { int min1 =min(num1,min(num2,num3)); int max2 =max(num1,max(num2,num3)); if(min1<=sum&&max2>=sum) { return sum; } else if(min1<sum&&max2<sum) { return res(sum-temp/2,num1,num2,num3,temp/2); } else return res(sum+temp/2,num1,num2,num3,temp/2); } int main() { int k,num1,num2,num3; cin>>k>>num1>>num2>>num3; int sum=1; for(int i=1;i<=k;i++) { sum=2*sum; } cout<<res(sum/2,num1,num2,num3,sum/2)<<endl; return 0; }
点赞
送花
回复
分享
发布于 2017-08-29 22:10
滴滴
校招火热招聘中
官网直投
题目说的是满二叉树
点赞
送花
回复
分享
发布于 2017-08-29 22:23
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int[] nodes = new int[3]; for (int i = 0; i < n; ++i) { nodes[i] = in.nextInt(); } Arrays.sort(nodes); System.out.println(commonRoot(1 << (n - 1), nodes)); } } private static int commonRoot(int root, int[] nodes) { if (nodes[0] == root || nodes[2] == root) { return root; } if (nodes[0] > root) { return commonRoot(root + root >> 1, nodes); } if (nodes[2] < root) { return commonRoot(root >> 1, nodes); } else { return root; } } }
点赞
送花
回复
分享
发布于 2017-08-29 22:42
#include<iostream> using namespace std; int main() { int k, num1, num2, num3; cin>>k>>num1>>num2>>num3; int minNum = min(num1,(min(num2,num3))); int maxNum = max(num1,(max(num2,num3))); int flag1 = 1, flagMid = 1, flag2 = 1; while(k--) flag2 *= 2; flag2 = flag2 -1; flagMid = (flag1 + flag2)/2; while(minNum > flagMid || maxNum < flagMid) { if(minNum > flagMid) { flag1 = flagMid; flagMid = (flag1 + flag2 + 1)/2; } if(maxNum < flagMid) { flag2 = flagMid; flagMid = (flag1 + flag2)/2; } } cout<<flagMid<<endl; return 0; }
点赞
送花
回复
分享
发布于 2017-08-30 00:00

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务