2021阿里淘系技术部java工程师笔试

前两天参加了阿里淘系技术部Java工程师的笔试,于是把题目顺便整理出来,之前有私信让我找点编程题,这不来了,来试试,限时一个小时,语言不限
时间限制:C/C++ 1秒,其他语言两秒
空间限制:C/C++ 65536k,其他语言 131072k
64bit IO Format: %IId

一、牛牛的二叉树

题目描述

牛牛有一棵n个结点的二叉树,其编号从1~n,每个节点都有一个权值Vi。一棵树被称为对称的,要满足交换所有左右子树,与原先的树相等,树相等即结构相等以及对应节点的权值相等。
在这里插入图片描述
第一棵树是对称的,第二棵树是非对称的。
第二棵树进行交换所有子树之后如下:
在这里插入图片描述
现在牛牛给你这课二叉树的前序序列以及中序序列,以及这棵树每个节点的权值,牛牛请你帮他找到一棵子树,这棵子树的要求是对称的,且子树的权值和最大。一个结点的树也可以认为是一棵子树。请你输出权和的最大值。

输入描述

第一行为一个n,表示有n个节点
第二行有n个整数,表示节点i的权值Vi
第三行有n个整数,表示二叉树的前序遍历序列prei
第四行有n个整数,表示二叉树的中序遍历序列ini
1<=n<=105,1<=Vi<=109,1<=prei,ini<=n

输出描述

输出为一行,表示最大的权值和

示例1

输入

2
1 2
1 2
2 1

输出

2

说明

  1
 /
2

二叉树如上,只有包含2号节点的子树满足条件,其权值为2

示例2

输入

7
1 2 2 3 4 4 3
1 2 4 5 3 6 7
4 2 5 1 6 3 7

输出

19

说明

二叉树如题意中的树一,整棵树都是对称的所以权值和为所有节点之和为19

二、一二一二

题目描述

牛牛是一名刚入学的计算机系大学生,出于对计算机的喜爱,在高考结束后的那个暑假,自己写了一个小游戏,游戏内容如下:

玩家操控一个小人,从1号位置出发,每一轮可以向前移动一个位置或者直接向前两个位置,每到达一个位置,小人就睡=会取得该位置上的分值(初始拥有一号位置的分值)。由于小人的腿很长,所以,如果选择直接向前 两个位置,则不需要任何代价;而如果选择只向前移动一个位置,则小人需要花费精力控制自己的腿,向前迈一小步,这部分损失的经理需要花费到达位置的一半分值来弥补(如果不能整除,则向上取整)。

小人最多走到n号位置,一旦到达n号位置,游戏结束,如果玩家取得的分值不少于理论上的最高得分的90%,则挑战成功,获得奖励。

现在,牛牛需要书写一个程序,来自动得到这个理论上的最高得分。

输入描述

本题为多组测试数据,第一行输入一个正整数T(1<=T<=1000),代表测试数据的组数
对于每组测试数据,第一行输入一个正整数n(1<=n<=1000),代表每最远位置为n,小人最多只能移动到n号位置
第二行依次输入n个整数,a1,a2,······an(0<=an<=1000),代表乜咯位置上的分值

输出描述

对于每组测试数据,一行输出一个证书代表答案

示例1

输入

2
3
0 2 4
3
0 4 2

输出

4
3

说明

以第一个测试数据为例,有两种移动的方案:
1.向前移动一个位置,到达2,由于终点是3,所以接下去也只能向前移动一个位置,所以,取得的分值为0+2/2+4/2=3
2,直接向前移动两个位置,到达3,取得分值0+4=4

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值