来啦老铁!
笔者从事测试开发工作已3月有余,这期间跟代码打交道是越来越多了,很庆幸,团队里有大哥把关,写代码也不再是“放养式”的了,代码能力在实践中不断提升,同时也不断暴露我自身的不足,其中有几个点值得提一提:
- 解决问题通常使用常规代码,没有采用巧妙的算法或算法能力较差;
- 解决问题通常只实现就完事,没有考虑代码性能;
- 较缺乏“设计模式”实践,代码全靠垒;
问题还是蛮多的,接下来的日子里,我打算逐一突破,先来突一突算法吧!
大哥给了我一盏明灯:
多刷算法题!
连刷题网站都帮忙提供了:力扣 (LeetCode) 太贴心了吧!有兴趣的朋友也可以刷一刷算法题哦~
也就是说,给定一个整数数组,我们要找出数组中2个数,这2个数相加为目标值,返回这两个数在数组中的索引。
结合示例,看起来挺简单的嘛,2个for循环就能搞定这道题了,于是我的代码是代码是这样的(基于python3):
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums) - 1):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []
if __name__ == "__main__":
assert (Solution().twoSum(nums=[2, 7, 11, 15], target=9) == [0, 1])
assert (Solution().twoSum(nums=[2, 7, 11, 15], target=8) == [])
在网站上提交解题代码后,验证通过:
这里顺便要夸一夸力扣 (LeetCode) 网站了,网站做的还是挺友好的。
网站还提供了解题参考:
点开后我们会看到视频解题和文字解题,看了文字解题,我的解题方法是正确的,但仅仅是其中最为简单暴力的实现方法,正常会写点代码的都能解出题目,可是这种解题办法效率却比较低!
网站提供了另外一种解题方法,一起来看看:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
我只能说,算你狠,用一个for循环就搞定了!
从作者的解题思路可以看出:
- 作者在循环时就在哈希表中记录了必要信息;
- 巧妙的使用了if target - num in hashtable:判断条件,与我们直男的想法有反向思维的感觉!
作者写的代码都比较严谨,重复的代码都会抽离声明,如:
- 尽量减少代码冗余:使用了2次的len(nums) ,声明一个变量存储,如:n=len(nums);
- 考虑了异常情况:将未能找到两数之和为目标值的情况也考虑在内;
- 尽量减少资源使用:使用java声明哈希表时,不盲目指定哈希表长度,而是根据实际可能的最大情况定为len-1,而不是len;
- “以空间换时间”的想法,信手拈来!