大疆2022秋招笔试 —— 最小时间差、数组的最小偏移量

前言

上周参加了大疆2022的秋招笔试,我投的是Java岗。

题目分为单选、多选和编程题,然后大疆用的是赛码的平台,单选15道占60分,多选5道占20分,编程题2道占20分,这里主要记录分享编程题以及解题思路。

编程题

两题都是原题,都能在力扣上找到。

最小时间差 [中等]

题目大意

给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

示例 :
输入:timePoints = [“23:59”,“00:00”]
输出:1

提示:
2 <= timePoints.length <= 2 * 104
timePoints[i] 格式为 “HH:MM”

题目链接
https://leetcode.cn/problems/minimum-time-difference/

解题思路

这题说实话并不难。

很容易想到任意两个时间的最小时间差肯定是出现在相邻的两个时间节点中的,所以我们只需要把所有时间进行一个排序,然后再计算每两个相邻的时间差,保留最小值即可。
需要注意的是,排序之后要把第一个时间和最后一个时间单独求一次差值,因为时间是个环嘛,超过24小时就又变为0了。

然后上面的思路还可以进行简单的优化:因为24小时总共只有1440分钟,那么如果数组的长度超过1440,那肯定是有重复的时间节点的,那最小时间差肯定是0,直接返回即可。

AC代码(Java)

class Solution {
    public int findMinDifference(List<String> list) {
		int n = list.size();
		if (n > 1440) {
            return 0;
        }
		int ans = Integer.MAX_VALUE;
		list.sort(String::compareTo);
		for (int i = 0; i < n - 1; i++) {
			int sub = sub(list.get(i), list.get(i + 1));
			ans = Math.min(ans, sub);
		}
		int sub = subFirstAndLast(list.get(0), list.get(n - 1));
		ans = Math.min(ans, sub);
		return ans;
    }

	public static int sub(String s1, String s2) {
		// s1 需要大于 s2
		String[] split1 = s1.split(":");
		String[] split2 = s2.split(":");
		int h = Integer.parseInt(split2[0]) - Integer.parseInt(split1[0]);
		int m = Integer.parseInt(split2[1]) - Integer.parseInt(split1[1]);
		return h * 60 + m;
	}

	public static int subFirstAndLast(String first, String last) {
		return 1440 - sub(first, last);
	}
}

在这里插入图片描述

数组的最小偏移量 [困难]

题目大意

给你一个由 n 个正整数组成的数组 nums 。
你可以对数组的任意元素执行任意次数的两类操作:
如果元素是 偶数 ,除以 2
例如,如果数组是 [1,2,3,4] ,那么你可以对最后一个元素执行此操作,使其变成 [1,2,3,2]
如果元素是 奇数 ,乘上 2
例如,如果数组是 [1,2,3,4] ,那么你可以对第一个元素执行此操作,使其变成 [2,2,3,4]
数组的 偏移量 是数组中任意两个元素之间的 最大差值 。
返回数组在执行某些操作之后可以拥有的 最小偏移量 。

示例:
输入:nums = [1,2,3,4]
输出:1
解释:你可以将数组转换为 [1,2,3,2],然后转换成 [2,2,3,2],偏移量是 3 - 2 = 1

提示:
n == nums.length
2 <= n <= 5 * 104
1 <= nums[i] <= 109

题目链接
https://leetcode.cn/problems/minimize-deviation-in-array/

解题思路

这题有点偏,我看力扣上都没什么人讨论这题,害,还是我太菜了。思路如下:

  1. 奇数乘一次会变成偶数,变成偶数之后就不能乘了,所以所有初始为奇数的数都只能乘1次

  2. 偶数每次除2,那么最多只能除logN次(N为这个偶数),除到这个数为奇数为止

  3. 那我们可以先把所有的奇数都变成偶数,这样它们的操作就统一了,都只能进行除2

  4. 此时我们把数组排序,排序之后的最大值和最小值的差值就是当前数组的最大偏移量,但是这个值肯定不是最终的答案

  5. 我们可以每次都对该数组的第一个数(即最大值)进行除2,除完之后更新答案,然后再重新排序,然后再对第一个数除2。。。
    循环操作,最终数组的最大值为奇数的时候,就可以停止循环了,因为最大值已经确定了,不能再变小了,而最小值此肯定不能再变大了,分两种情况讨论:

    • 此时最小值为偶数,那肯定不能变大;
    • 此时最小值为奇数,由于我们刚开始把所有奇数都变为偶数了,所以这个奇数为偶数的时候我们已经计算过了。

    所以循环到最大值为奇数后,答案就不会再减小了。

  6. 从上面的思路可以看出,我们需要重复的进行排序,那这时候就可以使用堆来进行操作了

  7. 堆排序当然不用自己实现,用优先队列(PriorityQueue)就可以了,效果是一样的,它底层就是用堆实现的

AC代码(Java)

class Solution {
    public int minimumDeviation(int[] nums) {
		PriorityQueue<Integer> queue = new PriorityQueue<>(Comparator.reverseOrder());
		int min = Integer.MAX_VALUE;
		// 先把奇数变成偶数,并插入队列
		for (int i = 0; i < nums.length; i++) {
			if ((nums[i] & 1) == 1) {
				nums[i] <<= 1;
			}
			min = Math.min(min, nums[i]);
			queue.add(nums[i]);
		}
		// 每次取堆顶元素进行操作,直到元素为奇数
		int ans = Integer.MAX_VALUE;
		int top;
		for (top = queue.poll(); (top & 1) != 1; top = queue.poll()) {
			// 每次更新答案
			ans = Math.min(ans, top - min);
			queue.add(top >>= 1);
			// 最小值需要更新
			min = Math.min(top, min);
		}
		// 最后为奇数时需要重新判断一次
		return Math.min(ans, top - min);
    }
}

有点慢哈哈哈🤣🤣🤣

在这里插入图片描述

后记

有兴趣的同学可以自己去力扣上做一下这两题,感受一下大疆的笔试难度,我当时第二题是没有写出来的,后面复盘的时候找到原题再重新去写出来的。

大疆给的笔试时间是一个小时,前面单选和多选题我做了15分钟左右,那这两题的时间就是45分钟,大家可以去试试,给自己45分钟时间看能不能通过这两题🤪🤪🤪。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 2023年的数字IC设计聘已经结束,现在来回顾一下这次复盘。整个聘过程中,有数十家公司参加了笔试和面试,竞争非常激烈。 首先是笔试环节。笔试题目涵盖了数字电路设计、计算机组成原理、操作系统、数据结构等多个领域,题目难度也有所不同。其中,一些较难的题目需要对底层硬件有较深的理解和编程能力,还有一些考察算法和数据结构的应用,对于应聘者的基础能力要求较高。 然后是面试环节。面试中,面试官对于应聘者的技术能力、项目经验、学术背景等方面进行了深入的了解,考察了应聘者的思路清晰度、解决问题的能力、团队协作能力等方面。 整个聘过程中,很多公司更注重应聘者的实际能力和潜力,将实力放在第一位,并且更加关注应聘者的全面素质和团队协作能力。 总的来说,这次数字IC设计复盘展示了很多应聘者的编程能力和技术水平,对于应聘者而言更是一次宝贵的机会,同时也给了聘公司更多的选择和发现优秀人才的机会。 ### 回答2: 2023数字IC设计已经结束,各大公司也陆续公布了面试结果。回顾这次笔试和面试,可以发现许多新的趋势和特点。 笔试题趋势 首先,笔试题目趋向综合,不仅包括专业相关的知识,还涉及到诸如计算机编程、英语等的综合考核。这也足以印证了人才市场对于全面素质的重视。 其次,笔试题目更加注重实战能力,许多题目涉及到实际的设计场景和问题,需要熟练掌握工具的使用和项目的整体规划、协作。 再次,笔试题目考察重心更加突出学生的综合素质,注重全面考核应聘者的理解、分析、判断能力以及沟通协调等,更贴近企业实际需求。 面试特点 首先,面试对个人的专业能力和综合素质要求都很高,需要应聘者具备扎实的理论基础和实际工程经验,同时在沟通协调等方面也应有较强的个人能力。 其次,许多公司的面试特别注重细节问题,通过提问、测试等方式来发现和检验应聘者对细节的注意力和对整个系统的整体把握能力。 再次,许多企业对于应聘者的人品、性格、偏好等也会考究,主观因素对于面试结果有着不可忽视的作用。 总之,就目前的趋势来看,未来数学IC设计中,企业会更注重全面素质的考核和综合能力的培养。希望广大参加的同学都能沉淀好自己的能力,提高自身综合素质,为以后的职业发展夯实基础。 ### 回答3: 2023 数字 IC 设计已经落下帷幕,各家公司的笔试题、面试实录也相继公布。我们可以通过分析这些题目和面试问题,来了解企业对应届毕业生的需求和期待,也可以总结自己的申请情况,为下一轮聘做好准备。 首先,我们可以对各家公司的笔试题进行分类。大多数公司的笔试题目都围绕数字电路设计、模拟电路设计、通信电路设计、计算机组成原理等方向,题目难度较高,需要考生运用自己的专业知识进行解答。同时,也有部分公司会增加智力测试、数学逻辑等综合能力题目,考察应聘者的综合素质。为了应对这些题目,应聘者需要熟练掌握专业知识,同时也需要加强自己的综合能力训练。 其次,我们可以分析各家公司的面试问题。大多数公司的面试问题都是围绕应聘者的个人经历和能力进行的,包括个人介绍、自我评价、项目经验、职业规划等方面。同时,也有不少公司会增加逻辑思维类问题,考察应聘者的思维能力和解决问题的能力。为了应对面试,应聘者需要在个人经历和能力上强化自己的优势,并且提前思考可能会被问到的问题,对应准备相应的答案。 在总结这次经验的同时,也要注意未来的趋势和发展方向。随着数字 IC 设计的不断发展和创新,新技术不断涌现,应聘者需要不断学习新知识和新技术,以适应未来发展的需求。同时,公司也会更加注重应聘者的综合能力和创新能力,因此应聘者需要在专业知识的基础上,注重自己的软实力和创新思维的培养。 总而言之,2023 数字 IC 设计是一个很好的学习和锻炼机会。通过这次经历,应聘者可以更好地了解自己的实力和优势,也可以借此机会探索未来的发展方向和趋势。希望未来的应聘者可以以积极的心态面对挑战,不断学习和成长,为未来的数字 IC 设计行业做出更大的贡献。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿杆.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值