• 编程训练0


    1.已知一棵二叉树的前序遍历是ABCDEFGH,那么它的中序遍历一定不可能是:

    A. CBEDAGFH
    B. BADCFEHG
    C. DCEBFAHG
    D. CBDAFEHG

    答案:无

    考点:二叉树遍历

    • 前序遍历:根左右
    • 中序遍历:左根右
    • 后序遍历:左右根

    2. 10000个人背上依次贴着从1到10000的编号,他们从小到大依次报数,偶数出列,一圈后,从剩下的5000人再次从号码小的开始报数,偶数出列,直到没人出列为止。问最后一次出列的人,背上的编号是多少?

    A. 1
    B. 2049
    C. 4097
    D. 8193

    答案:D

    解析:注意看题,是问最后一次出列的人。A选项是永远不会出列的。

    思路:写出每轮出列的序号,找出规律,求最后一轮第一个出列序号即可

    第一次出列为2,4,6,8...

    第二次出列为3,7,11...

    第三次出列为5,13,21...

    则f(1)=2;

    f(2)=f(1)+pow(2,0)=3

    f(3)=f(2)+pow(2,1)=f(1)+pow(2,0)+pow(2,1)=5

    ...

    f(n)=f(n-1)+pow(2,n-2)

    则f(n)=f(1)+pow(2,0)+pow(2,1)+...+pow(2,n-2)=k<10000,运用等比公式,化简为k=pow(2,n-1)+1<10000,得pow(2,n-1)=pow(2,13)=8192,k=8193

    3.阅读下面那段代码,给出handle(1024,256)的返回值

    1  handle(a, b) {  
    2         if(a==0) return b;  
    3         if(b==0) return a;  
    4         i=a^b;  
    5         j=(a&b)<<1;  
    6         return  handle(i,j);  
    7     }

    答案:1280

    考点:^异或(相异为1)、&位与(同1为1)、<<左移(a<<b,a左移b位,a乘以2的b次方)

    第一轮: a = 1024 ,  b = 256  ,  i = 1280,  j =  0

    第二轮: a = 1280,b = 0 ,执行语句

    if(b==0) return a;

    输出为1280

    4. 下面有段数字处理函数的伪代码,阅读后,请给出handle(12354)的返回值

     1 handle( num ){  
     2     result = 0;  
     3     i = num;
     4    while (i !=0 )  
     5     {  
     6         i = i/10*10;  
     7         result = result * 10 + num - i;  
     8         i = i /10;  
     9         num = num/10;  
    10     }  
    11     return result;  
    12 } 

    答案:45321

    解析:倒序输出

    5. 一封奇怪的信:

    题目描述:

    现在你需要用一台奇怪的打字机书写一封书信。信的每行只能容纳宽度为100的字符,也就是说如果写下某个字符会导致行宽超过100,那么就要另起一行书写

    信的内容由a-z的26个小写字母构成,而每个字母的宽度均会事先约定。例如字符宽度约定为[1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],那么就代表'a'到'd'四个字母的宽度分别是1,2,3,4,而'e'到'z'的宽度均为5

    那么按照上述规则将给定内容S书写成一封信后,这封信共有几行?最后一行宽度是多少?

    输入例子1:
    5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
    helloworld

    输出例子1:
    1 50

    例子说明1:
    "5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5"规定每个字符宽度为5
    "helloworld"是输入的字符串S
    由于S共包含10个字符,也即共占用50个字符宽度,因此可以写在同一行

    输入例子2:
    5 5 5 5 5 5 10 10 10 10 10 10 10 10 10 10 10 10 5 5 5 5 5 5 5 5
    hahahahahahahaha

    输出例子2:
    2 20

    例子说明2:
    "5 5 5 5 5 5 10 10 10 10 10 10 10 10 10 10 10 10 5 5 5 5 5 5 5 5"规定了每个字符宽度
    "hahahahahahahaha"是输入的字符串S
    由于h宽度为10,a宽度为5,因此'hahahahahahah'占用100字符宽度可以写在第一行,‘aha’写在第二行也即最后一行。因此字符宽度为20

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     string str;
    10     int num[30];
    11     for(int i=0; i<26; i++)
    12     {
    13         cin >> num[i];
    14     }
    15     cin >> str;
    16     int count= 1, len = 0;
    17     for(int i=0; i<str.length(); i++)
    18     {
    19         int n = num[str[i] - 'a'];
    20         if(len + n > 100)
    21         {
    22             len = n;
    23             count++;
    24         }
    25         else
    26         {
    27             len += n;
    28         }
    29     }
    30     cout << count << " " << len << endl;
    31     return 0;
    32 }

    6. 糖果谜题:

    小明是幼儿园的一名老师。某天幼儿园园长给小朋友们每人发一颗糖果,小朋友们拿到后发现有一些同学拿到的糖果颜色和自己相同,有一些同学糖果颜色和自己不同。

    假定每个小朋友只知道有多少同学和自己拿到了相同颜色的糖果。

    上课后,有一部分小朋友兴奋的把这一结果告诉小明老师,并让小明老师猜一猜,最少有多少同学拿到了糖果。

    例如有三个小朋友告诉小明老师这一结果如下:

    其中第一个小朋友发现有1人和自己糖果颜色一样,第二个小朋友也发现有1人和自己糖果颜色一样,第三个小朋友发现有3人和自己糖果颜色一样。

    第一二个小朋友可互相认为对方和自己颜色相同,比如红色;

    第三个小朋友不可能再为红色(否则第一二个小朋友会发现有2人和自己糖果颜色相同),假设他拿到的为蓝色糖果,那么至少还有另外3位同学拿到蓝色的糖果,最终至少有6位小朋友拿到了糖果。

    现在请你帮助小明老师解答下这个谜题。

     1 #include <map>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <iostream>
     6 #include <algorithm>
     7 using namespace std;
     8 map<int, int> Map;
     9 vector<int> a;
    10 int main()
    11 {
    12     int tot;
    13     while(cin >> tot)
    14     {
    15         a.push_back(tot);
    16         Map[tot]++;
    17     }
    18     int num = 0;
    19     for(int i=0; i<a.size(); i++)
    20     {
    21         int x = a[i];
    22         if(Map[x] <= 0)
    23         {
    24             continue;
    25         }
    26         while(Map[x] > 0)
    27         {
    28             num += x + 1;
    29             Map[x] -= x + 1;
    30         }
    31     }
    32     cout << num << endl;;
    33 }
  • 相关阅读:
    python中字典一键多相同值反转技巧
    win10下安装mysql
    上台阶问题的具体走法用python来实现
    桥接模式
    适配器模式
    多线程中lock的使用
    原型模式
    多线程
    建造者模式
    代理模式
  • 原文地址:https://www.cnblogs.com/lijuanhu321/p/9459580.html
Copyright © 2020-2023  润新知