BAT实习内推笔试卷(第一场)——个人答案以及分析
第一题:
给定一个长度不小于2的数组arr。
写一个函数调整arr,使arr中要么全部的偶数位上都是偶数,要么全部的奇数位上都是奇数上。 要求:假设数组长度为N。时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6...算作偶数位,下标1,3,5,7...算作奇数位,比如[1,2,3,4]调整为[2,1,4,3]就可以
分析:
时间复杂度请达到O(N),就不能用多重循环。额外空间复杂度请达到O(1),,也就不能用辅助的数组之类的,就是要在单次扫描中,通过交换2个数的位置来实现。
事实上我们换个思维来想,假设有2个同样长度数组A,B。满足要么A数组全是偶数。要么B数组全是奇数,是不是就能非常快的有思路了。想一下再看以下分析。
2个指针P_A和P_B分别指向A,B,首先P_A找出第一个奇数,然后P_B找出第一个偶数,交换。然后循环这个方案,直到某个指针达到数组的末尾。
事实上这个题和上面的思路一样。相当于把2个数组交叉放在一起。偶数位置的相当于A数组。奇数位置相当于B数组。仅仅是每次移动2个位置
代码:
public class Solution {
/**
* 奇数位上都是奇数或者偶数位上都是偶数
* 输入:数组arr。长度大于2
* 将arr调整成奇数位上都是奇数或者偶数位上都是偶数
*/
public void oddInOddEvenInEven(int[] arr) {
int len = arr.length;
if (len <= 2) {
return;
}
int even = 0;
int odd = 1;
while (even < len && odd < len) {
if (arr[even] % 2 != 0)
{
odd = findEven(arr, odd);
if (odd < len) {
int temp = arr[odd];
arr[odd] = arr[even];
arr[even] = temp;
}
}
even += 2;
}
}
private int findEven(int[] arr, int odd) {
for (int i = odd; i < arr.length; i+=2) {
if (arr[i] % 2 == 0) {
return i;
}
}
return arr.length;
}
}
第二题
1。arr的全部非空子集中,把每一个子集内的全部元素加起来会出现非常多的值。当中最小的记为min,最大的记为max; 2。在区间[min,max]上。假设有一些正数不能够被arr某一个子集相加得到。那么这些正数中最小的那个,就是arr的最小不可组成和; 3。在区间[min,max]上。假设全部的数都能够被arr的某一个子集相加得到,那么max+1是arr的最小不可组成和; 举例: arr = {3,2,5} arr的min为2,max为10,在区间[2,10]上。4是不能被不论什么一个子集相加得到的值中最小的,所以4是arr的最小不可组成和;
arr = {3,2,4} arr的min为2,max为9。在区间[2,9]上。8是不能被不论什么一个子集相加得到的值中最小的,所以8是arr的最小不可组成和; arr = {3,1,2} arr的min为1。max为6,在区间[2,6]上,不论什么数都能够被某一个子集相加得到,所以7是arr的最小不可组成和; 请写函数返回arr的最小不可组成和。
然后考虑第3个元素a3,那么a1,a2,a3,a4能组合的全部情况是什么呢:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Solution {
/**
* 正数数组中的最小不可组成和
* 输入:正数数组arr
* 返回:正数数组中的最小不可组成和
*/
public int getFirstUnFormedNum(int[] arr) {
int len=arr.length;
if(len==0){
return 0;
}
if(len==1){
return arr[0]+1;
}
Arrays.sort(arr);
if(len==2){
return arr[1]-arr[0]==1? arr[1]+1:arr[0]+1;
} int min=arr[0];
int max=arr[len-1];
int sum=0;
for(int i=0;i<arr.length;i++){
sum+=arr[i];
}
int[] flag=new int[sum-min+1]; Set<Integer> integers=new HashSet<Integer>();
integers.add(arr[0]);
integers.add(arr[1]);
integers.add(arr[1]+arr[0]); int set_max=arr[1]+arr[0];
setFlag(arr[0],min,flag);
setFlag(arr[1],min,flag);
setFlag(set_max,min,flag);
for(int i=2;i<len;i++){
int temp=arr[i];
Set<Integer> temp_set=new HashSet<Integer>(integers);
temp_set.add(temp);
setFlag(temp,min,flag); for (Iterator iterator = integers.iterator(); iterator.hasNext();) {
int v = (Integer) iterator.next();
temp_set.add(v+temp);
setFlag(v+temp,min,flag);
}
set_max+=temp;
integers=temp_set;
int res=judge(flag,temp-min);
if(res!=-1){
return res+min;
}
}
int res=judge(flag,sum-min);
if(res!=-1){
return res+min;
}
return sum+1;
} private int judge(int[] flag, int max) {
for(int i=0;i<max;i++){
if(flag[i]==0){
return i;
}
}
return -1;
} private void setFlag(int i, int min, int[] flag) {
flag[i-min]=1;
}
}
第三题
比如: 硬币面值与排列为:1,2,3,4,5,如今轮到玩家1拿硬币。 在当前状态下,玩家1仅仅能拿走1或5。 假设玩家1拿走1。则排列变为2,3,4,5。那么接下来玩家2能够拿走2或5。然后继续轮到玩家1拿硬币... 假设玩家1拿走5。则排列变为1,2,3,4,那么接下来玩家2能够拿走1或4;然后继续轮到玩家1拿硬币... 游戏依照这个规则进行,直到全部的硬币被拿完。每一个玩家获得的分数是各自拿走硬币的总和。
游戏胜负的规定: 假设玩家1最后获得的分数大于玩家2,则玩家1获胜; 假设玩家2最后获得的分数大于玩家1,则玩家2获胜;
由于玩家1先拿硬币。所以假设最后两人获得分数一样则玩家2获胜; 给定一个数组arr。表示硬币的面值和排列状况,请返回终于获胜者的分数。
样例: arr=[8,7,5,3] 玩家1将获胜,分数为13 所以返回13 arr=[1,9,1] 玩家2将获胜,分数为9 所以返回9
i<j
public class Solution {
/**
* 得到硬币博弈问题的获胜分值
* 输入:代表硬币排列情况的数组arr
* 返回:硬币博弈问题的获胜分值
*/
public int getWinValue(int[] arr) {
int len=arr.length;
int[][] d=new int[len][len];
int sum=0;
for(int i=0;i<len;i++){
d[i][i]=arr[i];
sum+=arr[i];
}
for(int w=1;w<len;w++){
for(int i=0;i<len-w;i++) {
rule(arr,i,i+w,d);
}
}
return (Math.abs(d[0][len-1])+sum)/2;
}
private void rule(int[] arr, int i, int w, int[][] d) {
int left=arr[i]-d[i+1][w];
int right=arr[w]-d[i][w-1];
if(left>right){
d[i][w]=left;
}else{
d[i][w]=right;
}
}
}
BAT实习内推笔试卷(第一场)——个人答案以及分析的更多相关文章
- 剑指Offer——网易校招内推笔试题+模拟题知识点总结
剑指Offer--网易校招内推笔试题+模拟题知识点总结 前言 2016.8.2 19:00网易校招内推笔试开始进行.前天晚上利用大约1小时时间完成了测评(这个必须做,关切到你能否参与面试).上午利用2 ...
- 互联网公司技术岗实习/求职经验(实习内推+简历+面试+offer篇)
找工作的事基本尘埃落定了,打算把这大半年来积累的经验写下来,基本都是我希望当年找实习的时候自己能够知道的东西,帮师弟师妹们消除一点信息不平等,攒攒RP~ 不要像我当年那样,接到电话吓成狗,没接到电话吓 ...
- 阿里2019实习内推,五轮技术面+一轮HR面,Java岗面经
在牛客网上获取到很多知识和信息,现在反馈一波,希望能对广大找实习的同学有所帮助. 个人情况:EE方向渣硕,二月末内推了阿里集团某部门Java岗,约三周完成了所有面试. 面经如下: 一面 (简历评估): ...
- 【字节校招】【实习】【内推】字节跳动春招(校招或实习均可)以及日常实习内推ing
本人是年前刚刚入职抖音的应届生,职业认证还未来的级更改,但是这些都不重要.重要的是我们不能错过优秀的你~ 字节跳动的相关福利我就不介绍了,技术实习生是400/天,房补是1500/月,三餐免费,下午茶, ...
- 2018Java研发实习内推
作者:sdu王镜鑫链接:https://www.nowcoder.com/discuss/74573?type=0&order=4&pos=7&page=1来源:牛客网 本人某 ...
- 2016 网易校招内推C/C++第二场8.6
选择题20个,每个1.5,编程题3个,每个20,简答题1个10分. 解: 第二题,一开始喵了一眼,好开心,这不是水题么,第一反应想到的是递归,然后马上就写了,结果case10%,一脸蒙蔽,数据值很大, ...
- 剑指Offer——美团内推+校招笔试题+知识点总结
剑指Offer--美团内推+校招笔试题+知识点总结 前言 美团9.9内推笔试.9.11校招笔试,反正就是各种虐,笔试内容如下: 知识点:图的遍历(DFS.BFS).进程间通信.二叉查找树节点的删除及中 ...
- 【北京/上海/南京】【部门直推】【可查询】【实习&社招】字节跳动数据平台前端内推
[北京/上海/南京][部门直推][可查询][实习&社招]字节跳动数据平台前端内推 重要信息,写在前面 [投递邮箱]chengxinsong@bytedance.com [微信扫码] 2019 ...
- 2019年终总结:10场演讲、内推20人、公众号2万粉丝、Code Runner 1000万下载
2019年是值得记录的一年,成长许多,也收获许多. 做了 10 场大会的技术演讲,成功内推 20 人拿到微软 Offer,知乎 Live 2000 听众,公众号 2 万粉丝,GitHub 2万 sta ...
随机推荐
- BZOJ2806: [Ctsc2012]Cheat(广义后缀自动机,单调队列优化Dp)
Description Input 第一行两个整数N,M表示待检查的作文数量,和小强的标准作文库的行数接下来M行的01串,表示标准作文库接下来N行的01串,表示N篇作文 Output N行,每行一个整 ...
- Elasticsearch入门系列~通过Java一系列操作Elasticsearch
Elasticsearch索引的创建.数据的增删该查操作 上一章节已经在Linux系统上安装Elasticsearch并且可以外网访问,这节主要通过Java代码操作Elasticsearch 1.创建 ...
- Scala入门到精通——第二十九节 Scala数据库编程
本节主要内容 Scala Mavenproject的创建 Scala JDBC方式訪问MySQL Slick简单介绍 Slick数据库编程实战 SQL与Slick相互转换 本课程在多数内容是在官方教程 ...
- VA对于开发QT是神器,VA自动补全QT
我怎么就忘了,VA也可以适用于VS下开发QT程序.其中QT的头文件自己增加,主要是: C:\Qt\4.8.6_2008\include 但还有一些特殊类不认识,所以还得继续增加: C:\Qt\4.8. ...
- MySQL主从复制之Mycat简单配置和高可用
什么是Mycat 1.Mycat就是MySQL Server,而Mycat后面连接的MySQL Server,就好象是MySQL的存储引擎,如InnoDB,MyISAM等.因此,Mycat本身并不存储 ...
- 芯片AMS1117 电源芯片
- 鲁德http://www.testroad.org/topic/76
[最新的招聘信息]:1.联动优势科技有限公司招聘性能测试工程师 薪资20K左右 http://ask.testroad.org/article/4042.上海-交通银行总行-性能测试专家 ...
- centos7 分区满了,分析哪个目录或文件占用空间-小叶-51CTO博客
原文:centos7 分区满了,分析哪个目录或文件占用空间-小叶-51CTO博客 du -sh 例如: [root@zabbix ~]# du -sh /var/* 0 /var/adm 132M / ...
- Spring Boot 热部署(转)
Spring Boot 热部署 实际开发中,修改某个页面数据或逻辑功能都需要重启应用.这无形中降低了开发效率,所以使用热部署是十分必要的. 什么是热部署? 应用启动后会把编译好的Class文件加载的虚 ...
- equals、HashCode与实体类的设计
equals和HashCode都是用来去重的,即判断两个对象是否相等.如果是String类则我们直接用.equals()判断,如果是我们自己定义的类,需要有自己的判断方法,重写equals,如果是集合 ...