【Task16】LeetCode腾讯精选打卡

一、No0237. 删除链表中的节点

题目

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。

现有一个链表 – head = [4,5,1,9],它可以表示为:
在这里插入图片描述

示例1

  • 输入:head = [4,5,1,9], node = 5
  • 输出:[4,1,9]
  • 解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例2

  • 输入:head = [4,5,1,9], node = 1
  • 输出:[4,5,9]
  • 解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

提示

  • 链表至少包含两个节点。
  • 链表中所有节点的值都是唯一的。
  • 给定的节点为非末尾节点并且一定是链表中的一个有效节点。
  • 不要从你的函数中返回任何结果。

思路

进行赋值和指针操作

解题代码(Python3)

class Solution:
    def deleteNode(self, node):
        #链表至少包含两个结点且有效结点
        node.val,node.next = node.next.val,node.next.next

复杂度分析:

  • 时间复杂度O(1)
  • 空间复杂度O(1)

运行结果:

在这里插入图片描述

二、No0238. 除自身以外数组的乘积

题目

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。

示例

  • 输入: [1,2,3,4]
  • 输出: [24,12,8,6]

提示

题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。

说明

请不要使用除法,且在 O(n) 时间复杂度内完成此题。

进阶

你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)

思路

穷举规则,笨重不说,还遗漏了许多情况。

解题代码(Python3)

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        timesDict = {
    
    }
        #type:1 表示剔0模式
        #type:0 表示正常模式 
        def times(datas,type):
            result = 1
            for item in datas:
                if type == 1 and item != 0:
                    result *= item
                elif type == 0:
                    result *= item
            return result

        def dictTimes(key,datas):
            if key not in timesDict:
                result = times(datas)
                timesDict[key] = result
                return result
            else:
                return timesDict[key]
        
        def getZeroNum():
            number = nums.count(0)
            if number > 1:
                return 0
            else:
                return times(nums,1)
        n = len(nums)
        totalTimes = times(nums,0)
        return [totalTimes//x  if x!= 0 else getZeroNum() for x in nums]

复杂度分析

  • 时间复杂度O(n)
  • 空间复杂度O(n)

运行结果

在这里插入图片描述

三、No0292. Nim 游戏

题目

你和你的朋友,两个人一起玩 Nim 游戏:

扫描二维码关注公众号,回复: 12454551 查看本文章

桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 1 - 3 块石头。
拿掉最后一块石头的人就是获胜者。
假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。

示例1

  • 输入:n = 4
  • 输出:false
  • 解释:如果堆中有 4 块石头,那么你永远不会赢得比赛;
    因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

示例2

  • 输入:n = 1
  • 输出:true

示例3

  • 输入:n = 2
  • 输出:true

提示:

  • 1 <= n <= 231 - 1

思路

数学归纳法

解题代码(Python3)

class Solution:
    def canWinNim(self, n: int) -> bool:
        return False if n%4==0 else True

复杂度分析:

  • 时间复杂度 O(1)
  • 空间复杂度 O(1)

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/113359790