社招, 之江实验室笔试

新鲜的之江实验室社招笔试题目
1年经验投的之江实验室, 题目不难,但是用的是赛码网的编译器, 很难用, 输入格式也不对, 也没给输出, 好多API啥的也忘了, 所以没有跑起来
中间还有点公司的事情去处理, 回来时候已经只剩30分钟了, 后面思考了一下给了个Java版本的解法, 让大家看看行不行的通.
1. 给定一个序列S, 需要找一个尽可能长的子串, 使得子串的最大最小值不超过m, 输出子串的长度
input: [10,1,3,5,9] m = 4
output: 3
思路是: 滑动窗口+ TreeMap, 给一个Java的解法,
	public int findSubSequence(int m, int[] input){
		if(input == null || input.length == 0 ) return 0;
		int j = 0;
        //右指针
		int len = 1;
        //最大长度值初始化
		TreeMap<Integer, List<Integer>> maxMinMap = new TreeMap<>();
        //记录最大最小值, <key = 值, val = index列表> 
		HashMap<Integer, Integer> indexMap = new HashMap<>();
        //记录index, value 关系 <key = index, val = 值>
		for(int i=0; i< input.length; i++){
			while(j < input.length){
				maxMinMap.putIfAbsent(input[j], new ArrayList<>());
				maxMinMap.get(input[j]).add(j);
                //index放入值对应的列表
				indexMap.put(j, input[j]);
				if(!maxMinMap.isEmpty() && maxMinMap.lastKey() - maxMinMap.firstKey() > m ) {
					//最大最小值超过m, 移动左指针 
                    break;
				}
				len = Math.max(len, j-i+1);
                //计算最大值
				j++;
			}
			if(!maxMinMap.isEmpty()){
                //获得当前左指针index对应的值
				int val = indexMap.get(i);
				List<Integer> resultList = maxMinMap.getOrDefault(val, new ArrayList<>());
				//拿到值对应的列表
                if(!resultList.isEmpty()) {
					resultList.remove(Integer.valueOf(i));
                    //去掉在列表中的当前值
					if(resultList.isEmpty()) {
                        //如果空列表, 移除列表
						maxMinMap.remove(val);
					}
				}
			}
		}
		return len;
	}
2. 一个游戏的副本, 有一排需要打败的怪物, 初始状态下, 每个怪物1点血, 希望从左到右击杀这些怪物, 怪物分为0型和1型, 0型怪物1血, 1型怪物击杀后会给后面的0型怪物+1血
你每次挥刀扣怪物1血, 问你打完这些怪物需要挥刀多少次
input = [0,1,0,1]
output = 5
思路: 一开始觉得是dp, 后面发现应该就计数几次就可以解决了
	public int fightBoss(int[] input){
		int sum = input.length;
        //0, 1怪物血量基数=1
		int[] sumArray = new int[input.length];
        //建一个统计数组
		int countOne = 0;
		for(int i=0; i<input.length; i++){
			if(input[i] == 1) {
				countOne++;
			}
		}
        //扫描1的个数
		for(int i=input.length-1; i >=0 ; i--) {
            //从右往左扫
			if(input[i] == 0) {
				sumArray[i] = countOne;
                //遇到0加当前的1个数
			}
			if(input[i] == 1) {
				countOne--;
                //遇到1当前1个数-1
			}
		}
		for(int i=0; i<input.length; i++) {
			sum+=sumArray[i];
		}
        //累加结果
		return sum;
	}

#笔经##社招#
全部评论
第二个直接找到最后一个0的位置index,然后统计index之前的1个个数count,最后答案就是数组长度length+count
1 回复 分享
发布于 2021-07-30 10:20
学习了
点赞 回复 分享
发布于 2022-10-13 20:18 江苏
"子串的最大最小值不超过m"是指的最大值和最小值的差啊
点赞 回复 分享
发布于 2022-10-09 15:11 浙江
楼主笔试后来过了吗
点赞 回复 分享
发布于 2022-04-13 10:23
第二题可以更加简单一些
点赞 回复 分享
发布于 2021-09-15 14:32
请问之江实验室社招机试,考的是赛码上的原题吗?还是重新出题?
点赞 回复 分享
发布于 2021-07-27 17:25
这两题是之江实验室的笔试题目?请问楼主是什么岗位,入职了吗
点赞 回复 分享
发布于 2021-07-23 21:39

相关推荐

不愿透露姓名的神秘牛友
09-14 12:50
算法题:给一颗二叉树,返回重复出现过的子树根节点1.&nbsp;常见的&nbsp;GC&nbsp;算法有哪些?2.&nbsp;什么情况会出现&nbsp;Full&nbsp;GC?3.&nbsp;业务层面上,Full&nbsp;GC&nbsp;可能的原因是什么?4.&nbsp;如何定义线程安全?5.&nbsp;一般通过什么手段保证线程安全?6.&nbsp;如何理解可见性?7.&nbsp;什么情况会出现死锁?8.&nbsp;怎么解决死锁问题?9.&nbsp;对于&nbsp;MySQL&nbsp;来说,如何检测死锁?检测完后怎么避免一直死锁?10.&nbsp;你在&nbsp;MySQL&nbsp;数据使用过程中,是否发现过死锁?是什么场景?或者解决过死锁吗?11.&nbsp;MySQL&nbsp;有哪几种锁类型?12.&nbsp;同一个&nbsp;SQL&nbsp;语句对同样一份数据,加的锁类型会完全一样吗?13.&nbsp;Java&nbsp;中为什么需要&nbsp;ReentrantLock?14.&nbsp;设计线程池时,需要考虑哪些因素?15.&nbsp;一个线程池提交了一个父任务,父任务执行中提交多个子任务到同一个线程池,会有什么问题吗?16.&nbsp;并发中的伪共享问题是什么?17.&nbsp;什么情况会出现慢&nbsp;SQL?18.&nbsp;除了加索引,还有哪些解决慢&nbsp;SQL&nbsp;的方式?19.&nbsp;为什么要小表驱动大表?20.&nbsp;小表驱动大表和大表驱动小表在复杂度上有什么差异(假设小表数据量为&nbsp;N,大表为&nbsp;M)?21.&nbsp;什么情况下需要分库分表?22.&nbsp;分表是否足够?为什么要分库?23.&nbsp;为什么&nbsp;MySQL&nbsp;同一个库存放过多数据时性能会变差?24.&nbsp;Redis&nbsp;常用的数据结构有哪些?25.&nbsp;Zset&nbsp;主要做了什么?它主要使用的是什么数据结构?26.&nbsp;如何处理&nbsp;Redis&nbsp;大&nbsp;key&nbsp;和热&nbsp;key&nbsp;的问题?你是否遇到过这类问题?27.&nbsp;你在实习时,做过最有挑战的事情是什么?或者有过一开始觉得很难,后来通过学习等手段解决的经历吗?发面经攒人品,求pdd三面
查看28道真题和解析
点赞 评论 收藏
分享
评论
2
31
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务