• LeetCode 1.2.题


    1.两数之和

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]   #输出nums中两数之和为target的下标

    我自己想到的解法算是暴力解法:

    • 记录nums中一个值为a1,a2=target-a1
    • 遍历除a1以外的值,判断是否与a2相等
    • 获取a1和a2的下标值并输出

    有两点注意:

    • 第二个for循环的范围是从i之后开始的,这样保证不会出现相同下标值
    • 若获得a1、a2后则跳出循环(break),否则开始下一循环(continue)
    1. class Solution(object):
    2. def twoSum(self, nums, target):
    3. """
    4. :type nums: List[int]
    5. :type target: int
    6. :rtype: List[int]
    7. """
    8. out=[0,0]
    9. lens=len(nums)
    10. for i in range(lens):
    11. a2=target-nums[i]
    12. for j in range(i+1, lens):
    13. if nums[j]==a2:
    14. out[1]=j
    15. out[0]=i
    16. break
    17. elif nums[j] != a2:
    18. continue
    19. return out

    优化方法是使用哈希查找降低时间复杂度:

    1. def twoSum(nums, target):
    2. hashmap={} #创建一个hashmap
    3. for index,value in enumerate(nums):
    4. #判断hashmap中有a2这个值
    5. if hashmap.get(target - value) is not None:
    6. return [index,hashmap.get(target - value)]
    7. #没有a2时就将nums和其下标存储到hashmap中
    8. hashmap[value] = index

          

    2.两数相加

    题目描述

    知识点:

    单链表

    链表:每个节点有两个属性data和next,在创建ListNode类时包含着两个属性。每调用一次ListNode()就向该对象中添加了一个节点Node。

    1. node1 = ListNode(2)
    2. node2 = ListNode(4)
    3. node3 = ListNode(3)

    更改链表值时,涉及到指针的概念,这里我的理解是,定义两个空链表,一个用来在循环时赋值和移动指针到下一位置,这样才能改变链表的内容,最后遍历结束后指针指向链表的尾部。另一个链表用来最后return值,因为这个链表的指针指向链表头,调用next属性时才能输出内容。 

     解题思路:

    • 利用l1.val获得节点的值,
    • 将l1和l2每个节点值和flag相加,得到sum
    • 设置flag的值为sum取整(判断是否进位)
    • 将sum赋值给节点,将指针指向循环变量L 下一节点
    • 判断l1、l2是否遍历结束,未结束时将指针指向下一节点
    1. # Definition for singly-linked list.
    2. # class ListNode(object):
    3. # def __init__(self, val=0, next=None):
    4. # self.val = val
    5. # self.next = next
    6. class Solution(object):
    7. def addTwoNumbers(self, l1, l2):
    8. """
    9. :type l1: ListNode
    10. :type l2: ListNode
    11. :rtype: ListNode
    12. """
    13. lis = L = ListNode(0) #初始化两个链表,一个用来return,一个用来循环遍历
    14. flag = 0 #定义一个进位项
    15. while (l1 or l2 or flag):
    16. # x = l1.val if l1 else 0
    17. if l1:
    18. x = l1.val
    19. else:
    20. x=0
    21. # y = l2.val if l2 else 0
    22. if l2:
    23. y = l2.val
    24. else:
    25. y=0
    26. sum = flag+x+y
    27. flag = sum//10 #清空flag
    28. L.next=ListNode(sum%10) #生成一个节点
    29. L = L.next #指针指向下一个节点
    30. if(l1!=None):l1 = l1.next #以防l1和l2指针长度不一样导致相加错误
    31. if(l2!=None):l2 = l2.next
    32. if (flag>0):
    33. L.next=ListNode(1) #判断最高位是否需要进位
    34. return lis.next

    sum的值可以简化为一句代码得到:

    sum += (l1.val if l1 else 0) + (l2.val if l2 else 0)

  • 相关阅读:
    STM32F407的时钟
    Docker—容器数据卷
    「二叉树与递归的一些框架思维」「1464. 数组中两元素的最大乘积」(每日刷题打卡Day33)[C++]
    JS 严格模式和正常模式详解
    GEM5 Garnet DVFS / NoC DVFS教程:ruby.clk_domain ruby.voltage_domain
    MySQL主从复制+读写分离
    leetcode:100相同的数
    golang对接阿里云私有Bucket上传图片、授权访问图片
    利用京东云Web应用防火墙实现Web入侵防护
    1-丁基咪唑四氟硼酸盐([HC4im]BF4)|1-丁基-3-甲基咪唑四氟硼酸盐(BMI-BF4)|1-甲基3-丁基咪唑六氟磷酸盐([C4mim]PF6)
  • 原文地址:https://blog.csdn.net/icecreamdinner/article/details/126224394