为什么这么说呢?可以思考一下
学框架其实就是学怎么更好的用人家封装好的api
看源码,就是看人家怎么实现的这个组件,学习人家的设计思维。
但真的是这样吗?但其实大多数情况都是为了应付面试,然后实际学习场景大家都是看看别人的博客,看看讲解视频,然后随便扒扒源码
综上所述其实,无论学习新框架还是看源码,更多的考验的是记忆力,与略微的理解能力
其实我们都在逃避,相比于算法,其他的能力确实相对于来说比较容易掌握
能力分布表
逻辑能力 | 理解能力 | 记忆力 | |
---|---|---|---|
算法 | 60% | 30% | 10% |
新框架,新知识 | 10% | 20% | 70% |
源码探索 | 20% | 30% | 50% |
举个简单的例子
在海量数据中查询指定数据,粗笨的方法就是循环便利一边找到对应的就好了,
如何用算法来解决?
收益:数据量小的时候可能没什么明显收益,但假如我们数据量达到了1000w,两种查找方法的效率可能就是1000万次和24次的区别了(log2 10000000 = 23.25)
eg1:
假设有任意多张面额为 2 元、3 元、7 元的货币,现要用它们凑出 100 元,求总共有多少种可能性
暴力解法
public void s1_1() {
int count = 0;
for (int i = 0; i <= (100 / 7); i++) {
for (int j = 0; j <= (100 / 3); j++) {
for (int k = 0; k <= (100 / 2); k++) {
if (i * 7 + j * 3 + k * 2 == 100) {
count += 1;
}
}
}
}
System.out.println(count);
}
3 层的 for 循环。从结构上来看,显然的 O( n³ ) 的时间复杂度。思考一下会发现,最内层的 for 是多余的剔除无效操作处理
public void s1_2() {
int count = 0;
for (int i = 0; i <= (100 / 7); i++) {
for (int j = 0; j <= (100 / 3); j++) {
if ((100-i*7-j*3 >= 0)&&((100-i*7-j*3) % 2 == 0)) {
count += 1;
}
}
}
System.out.println(count);
}
eg2:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
暴力解法
public int[] s2_1(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
时空转换
public int[] s2_2(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; ++i) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[0];
}