前言
个人网站
公众号: 北京程序猿, 网站 : https://yaml.vip
算法真的重要么
有很多开发者可能有个疑问,平时写代码几乎用不到算法,为何出去面试时几乎所有公司都会面试算法题。
我相信有这个疑问的程序员不在少数。
最近逛知乎时看到一则关于面试算法是否有必要的帖子,大家也许在这可以找到答案。
作为一名做 Web 开发的 Java 工程师,算法在工作中基本不怎么用到,但为什么面试总会问算法的问题?
在工作中笔者也参与了不少面试,如何通过短短一个小时的面试去衡量面试者代码水平,答案只有一个:算法。
大家可以想想,数据量上亿的场景下O(N)和O(N^2)时间复杂度的解法时间耗时是否处于一个Level,当自己的leader review代码时内心会怎么想。相信此时各位内心已经有了答案。
面试算法题可以考察的点:
- 考虑问题的全面性
- 想法转换为代码的能力
- 面试者是否聪明(是否可以通过面试官的提示写出代码)
- 沟通能力
刷算法题平台
算法题
题干
给定一个整数数组num和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例
给定 num = [2, 7, 11, 15], target = 9。
因为 num[0] + num[1] = 2 + 7 = 9,所以返回 [0, 1]
解法
- 暴力破解
- 排序+前后两个指针
- 单指针+HashMap
复杂度
- 时间复杂度O(N^2)
- 时间复杂度O(NlogN)(通用排序算法时间复杂度)
- 时间复杂度O(N),空间复杂度O(N)
Java代码
public static int[] twoSum(int[] array, int target) {
int[] result = new int[2];
if (array == null || array.length <= 1) {
return result;
}
Map<Integer, Integer> map = new HashMap<>(64);
final int length = array.length;
for (int i = 0; i < length; i++) {
int element = target - array[i];
if (map.containsKey(element)) {
return new int[]{map.get(element), i};
}
map.put(array[i], i);
}
return result;
}
思考题
- 第九行代码为何用减法,而不用加法? 用加法会有问题么?
- 题目中有几个限定条件,如果限定条件去掉,代码该如何写?
- 把所有答案都找出来?
- 数字可以重复利用?
- 如果给定的数组是有序的?
本文著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请于文首标明作者姓名,保持文章完整性,并附上出处和文章链接!未按规范转载者,作者保留追究相应责任的权利!
作者:北京程序猿
链接: https://yaml.vip/2019/03/04/Leetcode%E4%B9%8B1-%E4%B8%A4%E6%95%B0%E4%B9%8B%E5%92%8CI/