• 【C++】基础强训


    选择题:

    1.已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是()

    •  A.abcdefg
    •  B.abdcefg
    •  C.adbcfeg
    •  D.abecdfg

    如果直到中序和前序,后序中的一种,必须直到前序就能知道另一种排序顺序。

    前序:根->左->右 , 中序:左->根->右, 前序:左->右->根

    我们拿出来后续bfegcda,根据中序排列。所以根是a,左子树是b且就他一个。 d在a的右边,c在a右边,d的右边,g在a,d,c的右边;e在a,d右边,c,g的左边。如果e画在g的左边在,这样e就不再c的左边了。

    所以答案:B

    2.对于顺序存储的线性表,访问结点和增加结点的时间复杂度为( c)

    • A O(n) O(n)
    • B O(n) O(1)
    • C O(1) O(n)
    • D O(1) O(1)

    看到顺序存储就想到数组了,既然有数组就可以用下标访问,所以访问结点的时间复杂度是O(1),但是增加结点就要挪动数据,所以是O(n)。

    3. 初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序 列为()

    • A 8 3 2 5 1 6 4 7
    • 3 2 8 5 1 4 6 7
    • C 3 8 2 5 1 6 7 4
    • D 8 2 3 5 1 4 7 6

     

    堆排序,所以要换位置。 

    4.将数组(7-6-3-5-4-1-2)按照堆排序的方法在原地进行升堆排序, 则第一轮排序后的顺序是(C)

    • A . 2 6 3 5 4 1 7
    • B . 6 2 3 5 4 1 7
    • C .6 5 3 2 4 1 7
    • D .1 5 3 2 4 6 7

    所以我们原地先建立一个堆。

    编程题:

    1.洗牌:

     

       这是大思路,洗一次牌的顺序是它,再洗一次,左手牌,右手牌的顺序仍旧根据排放规律再重新放到card中。

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. int T , n, k;
    7. cin>>T;
    8. while(T--) //输入T组数据
    9. {
    10. cin>>n>>k;
    11. int num=n*2; //手牌总数
    12. vector<int> card(num);
    13. for(int i=0;i
    14. {
    15. cin>>card[i]; //把牌输入进去
    16. }
    17. // 开始洗牌
    18. while(k--)
    19. {
    20. vector<int> tmp(card.begin(),card.end()); //临时牌的收养所
    21. for(int j=0;j
    22. {
    23. card[j*2]=tmp[j]; //左手牌的洗牌次序
    24. card[j*2+1]=tmp[n+j]; //右 手牌的洗牌次序
    25. }
    26. }
    27. for(int i=0;i-1;i++)
    28. {
    29. cout<" ";
    30. }
    31. cout<-1]<
    32. }
    33. }

    一定要注意最后一张牌的后面不带空格,所以我们给他开个专场。

    2.MP3光标位置

    •  解析:

    这个题其实我们要设置一个变量first指向每一页的第一首歌的编号,来判断是否需要翻页。

    再设置num表示光标所在歌的编号。

    • 1.n<=4(歌曲正好一页显示完,用不到first)
    1. num在第一首歌的位置,执行U命令,num变成最后一首歌就行了。
    2. num在最后一首歌的位置,执行D,num=1就可以了。
    3. 普通情况,U执行-运算,D+。
    • 2.歌数大于4首
    1. 第一页第一首歌,U操作,first到最后一页第一首,num到最后一页最后一首。
    2. 最后一页最后一首,first和num都到第一页第一首。
    3. 中间页的第一首歌进行U操作,first,num同时减一就可以
    4. 中间页的最后一首进行D操作,first,num同时加一就可以了。
    5. 普通情况,该加加,该减减。
    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. int n;
    7. string cmd;
    8. while(cin>>n>>cmd)
    9. {
    10. int first=1,num=1;
    11. //first表示每一页的第一首歌编号,num表示光标所在歌的编号
    12. //1.就4首歌不需要翻页
    13. if(n<=4)
    14. {
    15. for(int i=0;isize();i++)
    16. {
    17. if(num == 1 && cmd[i] == 'U') //光标是第一首歌
    18. num=n;
    19. else if(num == n && cmd[i] == 'D') //光标在最后一首歌
    20. num=1;
    21. else if(cmd[i] == 'U') //上命令
    22. num--;
    23. else
    24. num++;
    25. }
    26. for(int i=1;i<=n;i++)
    27. cout<" "; //打印的是歌曲那一页的歌编号
    28. cout<
    29. cout<//光标所在歌曲编号
    30. }
    31. //2.歌曲数目大于4首
    32. else
    33. {
    34. for(int i=0;isize();i++)
    35. {
    36. if(first == 1 && num == 1 && cmd[i] == 'U') //第一页第一首歌
    37. {
    38. first = n-3; //first要到最后一页的第一首歌哪去
    39. num = n;
    40. }
    41. else if(first == n-3 && num == n && cmd[i] == 'D') //最后一页的最后一首歌
    42. {
    43. first = num = 1;
    44. }
    45. else if(first!=1 && num== first && cmd[i]=='U')
    46. {
    47. first--;
    48. num--;
    49. }
    50. else if( first!=n-3 &&num==first+3&&cmd[i]=='D')
    51. {
    52. first++;
    53. num++;
    54. }
    55. else if(cmd[i]=='D')
    56. {
    57. num++;
    58. }
    59. else
    60. {
    61. num--;
    62. }
    63. }
    64. for(int i=first ;i<=first+3;i++)
    65. cout<" ";
    66. cout<
    67. cout<
    68. }
    69. }
    70. return 0;
    71. }
  • 相关阅读:
    【通信、算法、旅游、人工智能、图像处理、机械、医疗】EI会议(2023)
    嵌入式Linux 开发经验:编写用户态应用程序 ioctl 控制 misc 设备
    ElasticSearch 使用 searchAfter() 进行遍历查询 查到的数据总数小于 totalHits
    递归思想
    Selenium-鼠标和键盘操作
    15 Python使用MySQL
    Servlet
    uni-app 5小时快速入门 6 项目配置
    Hadoop原理与技术——hdfs命令行基本操作
    网络安全与密码学--AES加密
  • 原文地址:https://blog.csdn.net/bit_jie/article/details/127768423