腾讯2017实习生招聘在线笔试编程题(技术类-PC客户端开发)

二叉排序树

  对于一棵二叉排序树深度为K,节点数为 2k1 ,节点值为1至 2k1 。给出K和任意三个节点的值,输出包含该是三个节点的最小子树的根节点。

测试样例:

输入:
4 10 15 13

输出:
12

思路:
  一棵深度为4的满二叉排序树如所示:

二叉排序树

  观察每层最开始节点值为 2i1 。找出输入的三个节点值中的最大值和最小值,循环除 2i1 ,直至结果不一致。最大值除 2i1 取整再乘 2i1 即为所求。

#include <iostream>
#include <math.h>
using namespace std;

int max(int a,int b,int c)
{
    return (a>b?a:b)>c?(a>b?a:b):c;
}
int min(int a,int b,int c)
{
    return (a<b?a:b)<c?(a<b?a:b):c;
}

int main()
{
    int k,a,b,c;
    cin>>k>>a>>b>>c;
    int i=k-1;

    int Max=max(a,b,c);
    int Min=min(a,b,c);

    while(i>=0)
    {   
        int left=Max/(int)pow(2.0,i);
        int right=Min/(int)pow(2.0,i);

        if(left!=right)
            break;
        i--;
     }
    int root=(int) (Max/(int)pow(2.0,i)*(int)pow(2.0,i));
    cout<<root<<endl;
    return 0;
}

格式化输出

  编写代码,接收从屏幕输入的长度为16字节整数倍的字符串(均为可见字符),按示例格式排版输出。

测试样例:

输入:
abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl

输出:
16进制偏移        16进制表示(每行16个字符)*      原文*
   双空格分隔       双空格分隔        双空格分隔
00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop
00000010 71 72 73 74 75 76 77 78 79 7a 61 62 63 64 65 66 qrstuvwxyzabcdef
00000020 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 ghijklmnopqrstuv
00000030 77 78 79 7a 61 62 63 64 65 66 67 68 69 6a 6b 6c wxyzabcdefghijkl

思路:
  难点在于字符串的转义和16进制偏移的输出,掌握printf()的格式化规定符即可解决。

#include <iostream>
#include <string> 
#include <algorithm >
using namespace std;

int main()
{
    string str;
    cin>>str;

    //16进制转义
    char *temp=new char [3*str.size()];//一个字符转义为2个数字和1个空格
    for(int i=0;i<str.size();i++)
        sprintf(temp+3*i,"%x ",(int)str[i]);
    string res=temp;

    //输出
    unsigned int bais=0x00000000;
    for(int i=0;i<str.size()/16;i++)
    {
        printf("%08x  ",bais);
        cout<<res.substr(i*48,24)<<" ";
        cout<<res.substr(i*48+24,24)<<" ";
        cout<<str.substr(i*16,16)<<endl;
        bais+=0x00000010;
    }
    return 0;
}

  1. C语言 printf 格式化 输出 右对齐补零
  2. printf Type Field Characters
  3. Flag Directives
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值