欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

【python】力扣刷题笔记(一)

时间:2023-05-21
1.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: hashmap = {} for i in range(len(nums)): # 一边将 nums 中的元素加入 hashmap 中,一边判断差值是否在 hashmap 中 d_value = target - nums[i] # 差值 if d_value in hashmap: return [hashmap[d_value], i] hashmap[nums[i]] = i # 保证 key 不重复,需要先判断后加入

(1)Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
(2)Python len() 方法返回对象(字符、列表、元组等)长度或项目个数。

2.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: // 初始化个位节点,先不做进位 newPoint = ListNode(l1.val + l2.val) // rt用来作为最后return的节点,tp用来遍历节点 rt, tp = newPoint, newPoint // l1,l2只要后面还有节点,就继续往后遍历;或者新链表还需要继续往后进位 while (l1 and (l1.next != None)) or (l2 and (l2.next != None)) or (tp.val > 9): l1, l2 = l1.next if l1 else l1, l2.next if l2 else l2 tmpsum = (l1.val if l1 else 0) + (l2.val if l2 else 0) // 计算新链表下个节点的值(当前节点的进位+当前l1 l2的值之和),先不做进位 tp.next = ListNode(tp.val//10 + tmpsum) // 新链表当前节点的值取个位 tp.val %= 10 // 新链表往后便利一个节点 tp = tp.next return rt

(1) l1 = l1.next if l1 else l1
eg.max_value = x if x > y else y 等同于 若x > y,则max_value = x,否则:max_value = y
(2) tp.val//10
单斜杠(/)表示除法,且不管除数和被除数是不是整数,最后结果都是float类型
双斜杠(//)表示地板除,即先做除法(/),然后向下取整(floor)(不大于x的最大整数,如-3//2=-2)。至少有一方是float型时,结果为float型;两个数都是int型时,结果为int型

1523.在区间范围内统计奇数数目

给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。

class Solution: def countOdds(self, low: int, high: int) -> int: return (high+1)//2-low//2

1491.去掉最低工资和最高工资后的工资平均值

给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。
请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

class Solution: def average(self, salary: List[int]) -> float: return (sum(salary)-max(salary)-min(salary))/(len(salary)-2)

(1)max() 方法返回给定参数的最大值,参数可以为序列。
(2)min() 方法返回给定参数的最小值,参数可以为序列。
(3)sum() 方法对序列进行求和计算。

167.两数之和 II - 输入有序数组

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间。

class Solution: #双指针 def twoSum(self, numbers: List[int], target: int) -> List[int]: i = 0 j=len(numbers)-1 while itarget: j=j-1 else: i=i+1 return null

class Solution: #二分查找 def twoSum(self, numbers: List[int], target: int) -> List[int]: n = len(numbers) for i in range(n): low, high = i + 1, n - 1 while low <= high: mid = (low + high) // 2 if numbers[mid] == target - numbers[i]: return [i + 1, mid + 1] elif numbers[mid] > target - numbers[i]: high = mid - 1 else: low = mid + 1 return [-1, -1]

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。