一、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 游戏:
桌子上有一堆石头。
你们轮流进行自己的回合,你作为先手。
每一回合,轮到的人拿掉 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)