当前位置: 首页 > news >正文

面试150,数组 / 字符串

27. 移除元素

在这里插入图片描述

class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 把不等于 val 的值移动到前面n = len(nums)left = 0for right in range(n):if nums[right] != val:nums[left] = nums[right]left += 1return left

26. 删除有序数组中的重复项

在这里插入图片描述

只保留 1 个元素

class Solution:def removeDuplicates(self, nums: List[int]) -> int:n = len(nums) left = 0  # 指向有效数组的最后一个元素# right 遍历数组, 每次与有效数组最后一个元素比较是否相同for right in range(n):if nums[right] != nums[left]:left += 1nums[left] = nums[right]return left + 1

80. 删除有序数组中的重复项 II

在这里插入图片描述
保留 k 个元素,次数 k = 2

class Solution:def removeDuplicates(self, nums: List[int]) -> int:n = len(nums)left = 0  # 指向有效数组的后一个位置k = 2  # 保留两个for right in range(n):if left < k or nums[right] != nums[left-k]:nums[left] = nums[right]left += 1return left

274. H 指数

在这里插入图片描述
一般的情况下

class Solution:def hIndex(self, citations: List[int]) -> int:n = len(citations)cnt = [0] * (n + 1)  # cnt[i] 引用次数 >= i 的数目for v in citations:cite = min(v, n)  # 引用次数大于 n 的情况, 算作ncnt[cite] += 1s = 0for i in range(n, -1, -1):s += cnt[i]  # 引用次数>=i的数量if s >= i:return i

有序的情况下

class Solution:def hIndex(self, citations: List[int]) -> int:# 有h篇论文的cite次数>=hn = len(citations)citations.sort()ans = 0for i, v in enumerate(citations):d = n - i + 1  # 剩余文章数if v >= d:return d

380. O(1) 时间插入、删除和获取随机元素

在这里插入图片描述
list 删除尾元素的速度为 O(1)
所以删除的时候,可以将待删除的值与末尾元素交换,然后删除末尾元素

from random import choice
class RandomizedSet:def __init__(self):self.nums = []self.indices = {}  # { val: 在nums中的下标 }def insert(self, val: int) -> bool:if val in self.indices:return False# 如果不在, 则在末尾插入元素self.indices[val] = len(self.nums)self.nums.append(val)return Truedef remove(self, val: int) -> bool:if val not in self.indices:return Falseid = self.indices[val]  # val在nums中的下标# 1.将末尾元素与待删除元素的位置交换self.nums[id] = self.nums[-1]  # 将末尾元素的值移动到当前val位置self.indices[self.nums[id]] = id  # 更新对应的id# 删除 valself.nums.pop()del self.indices[val]return Truedef getRandom(self) -> int:return choice(self.nums)

134. 加油站

在这里插入图片描述
“已经在谷底了,怎么走都是向上。”

下图为,从 0 加油站出发,到达每个站时的油量变化
可以看出,当走到 3 号加油站时,油量达到最低
在这里插入图片描述
所以从该点出发,之后的油量都不会比当前还低

在这里插入图片描述

同时,判断 sum(gas)sum(cost) 的大小关系

  • 如果 sum(gas) >= sum(cost) ,则一定有解
  • 反之没有,返回 -1
class Solution:def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:# 先计算从 0 号加油站出发的油量变化,然后从中找到油量最低时所处的加油站ans = 0min_s = 0  # 表示从 0 出发遇到的最小油量点s = 0for i, (g, c) in enumerate(zip(gas, cost)):s += g - c  # 在 i 处加油,然后出发从 i 到 i+1if s < min_s:min_s = s  # 更新最小油量ans = i + 1  # 注意 s 减去 c 之后,汽车在 i+1 而不是 i# 循环结束后,s 即为 gas 之和减去 cost 之和if s < 0:  # 说明不存在可行解return -1else:return ans

13. 罗马数字转整数

在这里插入图片描述

class Solution:def romanToInt(self, s: str) -> int:# 小数在前表示<减去>, 小数在后表示<加上># 从后往前遍历, 判断当前数是否比上一个数大# 如果大于上一个数, 则直接加, 反之用减d = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}s = s[::-1]last_val = 0ans = 0for c in s:v = d[c]if v >= last_val:ans += velse:ans -= vlast_val = vreturn ans

12. 整数转罗马数字

在这里插入图片描述

class Solution:def intToRoman(self, num: int) -> str:hashmap = {1000:'M', 900:'CM', 500:'D', 400:'CD',100:'C', 90:'XC',50:'L', 40:'XL', 10:'X', 9:'IX', 5:'V', 4:'IV', 1:'I'}ans = ''for key in hashmap:if num // key != 0:count = num // keyans += hashmap[key] * countnum %= keyreturn ans



http://www.mrgr.cn/news/93161.html

相关文章:

  • 通义万相2.1:开启视频生成新时代
  • C++并发以及多线程的秘密
  • 复试准备日常
  • Spring项目中常用操作记录
  • Linux搭建个人大模型RAG-(ollama+deepseek+anythingLLM)
  • Rust编程实战:初探WebAssembly
  • 爬虫Incapsula reese84加密案例:Etihad航空
  • 【第12节】C++设计模式(结构型模式)-Proxy(代理)模式
  • 9道Dubbo面试题
  • Excel-to-JSON v2.0.0发布,可以在Excel内部,把Excel表格转换成JSON,嵌套的JSON也能转
  • 【笔记ing】python
  • 大模型工程师学习日记(十一):FAISS 高效相似度搜索和密集向量聚类的库
  • Android 布局系列(四):ConstraintLayout 使用指南
  • C语言_数据结构总结1:静态分配方式的顺序表
  • 解锁Java解释器模式:概念、应用与实战
  • 测试工程师的DeepSeek提效2:自动化测试应用
  • 2025年渗透测试面试题总结- 阿某云安全实习(题目+回答)
  • Metal学习笔记十一:贴图和材质
  • mac上最好的Python开发环境之Anaconda+Pycharm
  • alpine linux 系统最新版安装及使用教程