题目1 只出现一次的数字 Leetcode136
描述:给定一个非空整数数组 nums
,nums
中除了某个元素只出现一次以外,其余每个元素均出现两次。
要求:找出那个只出现了一次的元素。
说明:
- 要求不能使用额外的存储空间。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
# 这题可以用位运算
# 0异或任何数都是这个数本身
# 任何数与本身异或,结果都是0
# 所以这题就只需要用一个0来异或所有数,就可以找到这个列表中唯一的数了
num = 0
for x in nums:
num = num^x
return num
题目2 合并区间 Leetcode56
描述:给定数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。
要求:合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
思路:先把intervals,即原列表中的各个区间按照升序排列,再模拟一个栈,先放一个区间进去,然后逐次放入新的区间,如果新的区间可以与这个区间合并,则合并,不可合并,则top指针加1,将该区间压入栈顶,最终返回这个栈列表
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals[:] = sorted(intervals, key = lambda x:x[0]) # 确保区间都是升序排列
s = [intervals[0]]
top = 0
for i in range(1,len(intervals)):
if s[top][1] >= intervals[i][0] and s[top][1] <= intervals[i][1]:
s[top][1] = intervals[i][1]
elif s[top][1] < intervals[i][0]:
top = top + 1
s.append(intervals[i])
return s
题目3 最大数 Leetcode179
描述:给定一个非负整数数组 nums
。
要求:重新排列数组中每个数的顺序,使之将数组中所有数字按顺序拼接起来所组成的整数最大。
import functools
def my_compare(x, y):
if str(x)+str(y) > str(y)+str(x): # 如果顺序结合的数更大,则不用交换,返回-1
return -1
elif str(x)+str(y) <= str(y)+str(x): # 如果顺序结合的数更小,则需要交换,返回1
return 1
else:
return 0
class Solution:
def largestNumber(self, nums: List[int]) -> str:
# 这也是一种贪心排序问题
# 如果想要最终的数字是个最大的数
# 那么这个数组中,每个数和左边的数结合的新数一定比和右边结合的新数更大
nums[:] = sorted(nums,key=functools.cmp_to_key(my_compare))
if nums[0]==0:
return "0"
s = ''
for x in nums:
s = s + str(x)
return s
额外加练 字符串的左右移 Leetcode1427
描述:
给定一个包含小写英文字母的字符串 s
以及一个矩阵 shift
,其中 shift[i] = [direction, amount]
:
direction
可以为0
(表示左移)或1
(表示右移)。amount
表示s
左右移的位数。- 左移 1 位表示移除
s
的第一个字符,并将该字符插入到s
的结尾。 - 类似地,右移 1 位表示移除
s
的最后一个字符,并将该字符插入到s
的开头。
对这个字符串进行所有操作后,返回最终结果
思路:循环位移时,左移右移之间往往可以相互转换,我这里是将左移视为负数,右移视为正数,全部加起来之后,再对字符串整体长度取模。这样就会把所有的操作化为一个右移操作。
class Solution:
def stringShift(self, s: str, shift: List[List[int]]) -> str:
move = 0
for x in shift:
if x[0]==0:
move = move-x[1]
else:
move = move+x[1]
move = move % len(s) # 统统转化成右移
l = ''
for i in range(move):
l = l + s[-move + i ] # 先把会被移到前面的字符串加到头上
for i in range(0,len(s)-move): # 再把剩下的字符串给加上
l = l + s[i]
return l