0
点赞
收藏
分享

微信扫一扫

算法练习 - 两数之和

来啦老铁!

笔者从事测试开发工作已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;
  • “以空间换时间”的想法,信手拈来!

咱还是太年轻了,算法题,值得一刷再刷,加油!!!

举报

相关推荐

0 条评论