对于遇到的每一个题目,过后都作上标记:普通题目,难题、好题。此外,每一个题目都分为如下几个步骤作好详细的笔记:面试
每个题目都通过至少一遍这样的迭代。这样几遍下来,我对于每一个题目都有了更加深入的理解,大部分的题目我都有自信可以写出最优解甚至代码都是最优化的(至少比论坛回复里面的最高票答案还要精简)。算法
举个例子,两数之和问题。编程
我最先的解法是暴力搜索。当时的代码(Java)是这样的:数据结构
class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nums.length; i++) { for (int j = i+1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { return new int[]{i, j}; } } } throw new IllegalArgumentException("No two sum solution"); } }
这个解法不只复杂度高,并且代码冗长繁琐。学习
后来看了网上高票答案的解法,知道了用hashmap来作,因而写出了优化的代码(Java):优化
class Solution { public int[] twoSum(int[] nums, int target) { HashMap<Integer,Integer> map = new HashMap<>(); int[] res = new int[2]; for (int i = 0; i < nums.length; i++) { int dif = target - nums[i]; if (map.get(dif) != null) { res[0] = map.get(dif); res[1] = i; return res; } map.put(nums[i],i); } return res; } }
再后来,对代码进行了一些细节的简化:spa
public class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap(); for (int i = 0; i < nums.length; ++i) { if (map.containsKey(target- nums[i])) { return new int[]{map.get(target- nums[i]), i}; } map.put(nums[i], i); } return new int[]{-1, -1}; } }
至此,代码几乎达到最精简状态。(中间有略去几回迭代)总之,不断地学习别人的代码,改进本身的代码,不断地锤炼本身的代码,直至算法最优化,代码最简洁!code
潜移默化中,不只对题目解法有了更深入的理解(什么是最优解),并且也知道如何用最简洁的代码实现这个最优解。blog
再举个极端的例子吧,179. 最大数,这个题目我最后精简成的代码以下:get
public String largestNumber(int[] nums) {
return Arrays.stream(nums)
.mapToObj(String::valueOf)
.sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
.reduce((s1, s2) -> s1.equals("0") ? s2 : s1 + s2).get();
}
我本人不是算法高手,算是勤能补拙类型。这样长期坚持下来,慢慢地感受本身编程能力提高了不少。不只面试的时候驾轻就熟,并且在工做中提交code review的时候,每每有自信说本身的代码是简单,干净与优雅的。