力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。
--点击进入刷题地址
1.最后得到的余数
题目描述:
给定两个非空字符串 nums1 和 nums2,编写一个函数来实现将 nums2 不断整除以 nums1 并返回余数,直到余数为 0。返回最后得到的余数。
示例:
给定 nums1 = "10", nums2 = "4"
输出 0
解释:4 ÷ 10 = 0 余 0
代码:
def divide(nums1: str, nums2: str) -> int:
dividend = int(nums2) # 被除数
divisor = int(nums1) # 除数
remainder = dividend # 余数初始为被除数
while remainder >= divisor: # 当余数大于等于除数时,继续相除
temp = divisor # 临时保存除数,以便更新被除数和余数
dividend = remainder # 被除数更新为余数
remainder = dividend % temp # 余数更新为被除数除以临时保存的除数的余数
return remainder # 返回余数
小结:
- 最后得到的余数:这道题考察了如何通过整除操作来计算两个数的余数。我们使用一个循环来不断更新被除数和余数,直到余数为0。
2.反转链表
题目描述:
给定一个链表,反转链表并返回新的头节点。
示例:
输入:1->2->3->4->null
输出:4->3->2->1->null
代码:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val # 节点值
self.next = next # 下一个节点指针
def reverseList(head: ListNode) -> ListNode:
prev = None # 用于保存上一个节点,初始值为 None 表示反转前的链表没有节点(空链表)
curr = head # 当前节点指针,初始指向链表的头部(第一个节点)
while curr: # 当当前节点不为空时,进行反转操作
next_node = curr.next # 保存下一个节点,以便反转后连接链表
curr.next = prev # 将当前节点的下一个节点指向上一个节点,实现反转操作
prev = curr # 上一个节点更新为当前节点,准备处理下一个节点
curr = next_node # 当前节点更新为下一个节点,继续处理下一个节点(直到链表结束)
return prev # 返回反转后的链表的头部(最后一个节点)作为新的头节点(反转前是第一个节点)
小结:
- 反转链表:这道题考察了如何通过修改链表的指针来反转链表。我们使用两个指针,一个指向当前节点,另一个保存上一个节点,通过修改指针关系实现链表反转。
3.盛最多水的容器
题目描述:
给你 n 个非负整数 a1,a2,...,an,每个数代表一个坐标点 (i, ai)。在坐标内画 n 条垂直线,使得 i 垂直线的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴构成的容器可以容纳最多的水。
解题思路:
对于每个坐标点 i,计算以该点为顶点的矩形容器的面积 S = min(ai, a(n-i+1)) * i。其中 min(ai, a(n-i+1)) 表示容器的宽度,i 表示容器的长度。最后返回 S 的最大值即可。
代码实现:
def max_area(height):
max_area = 0
left = 0
right = len(height) - 1
while left < right:
area = min(height[left], height[right]) * (right - left)
if area > max_area:
max_area = area
if height[left] < height[right]:
left += 1
else:
right -= 1
return max_area
在这个实现中,我们使用双指针来维护容器的左右边界。左指针指向数组的起始位置,右指针指向数组的末尾位置。我们计算以左右指针为边界的矩形容器的面积,则更新最大面积的值,最后返回最大面积即可。