0122leetcode刷题5道python

面试题02.07

题目描述:
给定两个(单向)链表,判定它们是否相交并返回交点。请注意相交的定义基于节点的引用,而不是基于节点的值。换句话说,如果一个链表的第k个节点与另一个链表的第j个节点是同一节点(引用完全相同),则这两个链表相交。

示例:
在这里插入图片描述
解答:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        #双指针
        ta, tb = headA, headB
        while ta != tb:
            ta = ta.next if ta else headB
            tb = tb.next if tb else headA
        return tb

面试题03.02

题目描述:
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。

示例:
在这里插入图片描述
解答:

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.min_stack=list()
        self.stack=list()


    def push(self, x: int) -> None:
        self.stack.append(x)
        if not self.min_stack or x<=self.min_stack[-1]:
            self.min_stack.append(x)


    def pop(self) -> None:
        tmp=self.stack.pop()
        if tmp ==self.min_stack[-1]:
            self.min_stack.pop()


    def top(self) -> int:
        return self.stack[-1]


    def getMin(self) -> int:
        if not self.min_stack:
            return None
        return self.min_stack[-1]



# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()

剑指offer53-I

题目描述:
统计一个数字在排序数组中出现的次数。

示例:
在这里插入图片描述

解答:

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        sum=0
        for i in range(len(nums)):
            if nums[i]==target:
                sum+=1
        return sum

剑指offer53-II

题目描述:
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例:
在这里插入图片描述
解答:

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        '''
        二分查找
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] <= mid:
                left = mid + 1
            else:
                right = mid - 1
        return left
        '''
        sum = 0
        n=len(nums)
        total=(n*(n+1))//2
        for i in range(len(nums)):
            sum+=nums[i]
        return total-sum
        


剑指offer57

题目描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

示例:
在这里插入图片描述
解答:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        n=len(nums)
        l,r=0,n-1
        while l<r:
            sum=nums[l]+nums[r]
            if sum==target:
                return [nums[l],nums[r]]
            elif sum>target:
                r-=1
            else:
                l+=1
        return []
            

猜你喜欢

转载自blog.csdn.net/yeqing1997/article/details/112898625