面试150,数组 / 字符串

打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

27. 移除元素


  1. class Solution:
  2.     def removeElement(self, nums: List[int], val: int) -> int:
  3.         # 把不等于 val 的值移动到前面
  4.         n = len(nums)
  5.         left = 0
  6.         for right in range(n):
  7.             if nums[right] != val:
  8.                 nums[left] = nums[right]
  9.                 left += 1
  10.         return left
复制代码

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


只保存 1 个元素
  1. class Solution:
  2.     def removeDuplicates(self, nums: List[int]) -> int:
  3.         n = len(nums)
  4.         left = 0  # 指向有效数组的最后一个元素
  5.         # right 遍历数组, 每次与有效数组最后一个元素比较是否相同
  6.         for right in range(n):
  7.             if nums[right] != nums[left]:
  8.                 left += 1
  9.                 nums[left] = nums[right]
  10.         return left + 1
复制代码

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


保存 k 个元素,次数 k = 2
  1. class Solution:
  2.     def removeDuplicates(self, nums: List[int]) -> int:
  3.         n = len(nums)
  4.         left = 0  # 指向有效数组的后一个位置
  5.         k = 2  # 保留两个
  6.         for right in range(n):
  7.             if left < k or nums[right] != nums[left-k]:
  8.                 nums[left] = nums[right]
  9.                 left += 1
  10.         return left
复制代码

274. H 指数


一样平常的情况下
  1. class Solution:
  2.     def hIndex(self, citations: List[int]) -> int:
  3.         n = len(citations)
  4.         cnt = [0] * (n + 1)  # cnt[i] 引用次数 >= i 的数目
  5.         for v in citations:
  6.             cite = min(v, n)  # 引用次数大于 n 的情况, 算作n
  7.             cnt[cite] += 1
  8.         
  9.         s = 0
  10.         for i in range(n, -1, -1):
  11.             s += cnt[i]  # 引用次数>=i的数量
  12.             if s >= i:
  13.                 return i
复制代码
有序的情况下
  1. class Solution:
  2.     def hIndex(self, citations: List[int]) -> int:
  3.         # 有h篇论文的cite次数>=h
  4.         n = len(citations)
  5.         citations.sort()
  6.         ans = 0
  7.         for i, v in enumerate(citations):
  8.             d = n - i + 1  # 剩余文章数
  9.             if v >= d:
  10.                 return d
复制代码

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


list 删除尾元素的速度为 O(1)
以是删除的时候,可以将待删除的值与末端元素交换,然后删除末端元素
  1. from random import choice
  2. class RandomizedSet:
  3.     def __init__(self):
  4.         self.nums = []
  5.         self.indices = {}  # { val: 在nums中的下标 }
  6.     def insert(self, val: int) -> bool:
  7.         if val in self.indices:
  8.             return False
  9.         # 如果不在, 则在末尾插入元素
  10.         self.indices[val] = len(self.nums)
  11.         self.nums.append(val)
  12.         return True
  13.     def remove(self, val: int) -> bool:
  14.         if val not in self.indices:
  15.             return False
  16.         id = self.indices[val]  # val在nums中的下标
  17.         # 1.将末尾元素与待删除元素的位置交换
  18.         self.nums[id] = self.nums[-1]  # 将末尾元素的值移动到当前val位置
  19.         self.indices[self.nums[id]] = id  # 更新对应的id
  20.         # 删除 val
  21.         self.nums.pop()
  22.         del self.indices[val]
  23.         return True
  24.     def getRandom(self) -> int:
  25.         return choice(self.nums)
复制代码

134. 加油站


“已经在谷底了,怎么走都是向上。”
下图为,从 0 加油站出发,到达每个站时的油量变化
可以看出,当走到 3 号加油站时,油量到达最低

以是从该点出发,之后的油量都不会比当前还低

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


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

13. 罗马数字转整数


  1. class Solution:
  2.     def romanToInt(self, s: str) -> int:
  3.         # 小数在前表示<减去>, 小数在后表示<加上>
  4.         # 从后往前遍历, 判断当前数是否比上一个数大
  5.         # 如果大于上一个数, 则直接加, 反之用减
  6.         d = {
  7.             'I':1,
  8.             'V':5,
  9.             'X':10,
  10.             'L':50,
  11.             'C':100,
  12.             'D':500,
  13.             'M':1000
  14.         }
  15.         s = s[::-1]
  16.         last_val = 0
  17.         ans = 0
  18.         for c in s:
  19.             v = d[c]
  20.             if v >= last_val:
  21.                 ans += v
  22.             else:
  23.                 ans -= v
  24.             last_val = v
  25.         
  26.         return ans
复制代码

12. 整数转罗马数字


  1. class Solution:
  2.     def intToRoman(self, num: int) -> str:
  3.         hashmap = {
  4.             1000:'M', 900:'CM',
  5.             500:'D', 400:'CD',
  6.             100:'C', 90:'XC',
  7.             50:'L', 40:'XL',
  8.             10:'X', 9:'IX',
  9.             5:'V', 4:'IV', 1:'I'}
  10.         ans = ''
  11.         for key in hashmap:
  12.             if num // key != 0:
  13.                 count = num // key
  14.                 ans += hashmap[key] * count
  15.                 num %= key
  16.         
  17.         return ans
复制代码



[code][/code]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表