目录
- 整数反转
- 反转字符串
- Python位运算符
- Python赋值运算符
- 矩阵转置
- 一行代码
- 调用内置函数zip()
- 存在重复元素II
- 哈希表
- 种花问题
- 跳格子解法
- 旋转矩阵
- 字符串轮转
- 返回倒数第k个节点
- 双指针解法
整数反转
给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。
反转字符串
采用[::-1]对字符串进行转置,[::-2]表示从len(str)-1到0,步长为2,例如python的反转结果为nhy。
Python位运算符
- (a & b) 按位与运算符
- (a | b) 按位或运算符
- (a ^ b) 按位异或运算符
- (~a) 按位取反运算符
- a<<2 左移动运算符
- a>>2 右移动运算符
Python赋值运算符
- *= 乘法赋值运算符
- /= 除法赋值运算符
- %= 取模赋值运算符
- **= 幂复制运算符
- //= 取整除赋值运算符
矩阵转置
一行代码
class Solution:
def transpose(self, A: List[List[int]]) -> List[List[int]]:
return [[A[i][j] for i in range(len(A))] for j in range(len(A[0]))]
调用内置函数zip()
内置函数zip()用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 利用 * 号操作符,可以将元组解压为列表。
class Solution:
def transpose(self, A: List[List[int]]) -> List[List[int]]:
return list(zip(*A))
存在重复元素II
哈希表
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在记忆体储存位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
hash={}
for i in range(len(nums)):
if(nums[i] not in hash):
hash[nums[i]]=i
else:
if(i-hash[nums[i]]<=k):
return True
else:
hash[nums[i]]=i
return False
种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false。
跳格子解法
遇到当前格子已种花,则跳过下一格子,即令指数增加2。
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
i=0
while i<len(flowerbed) and n>0:
if flowerbed[i]==1:
i += 2
else:
if i == len(flowerbed)-1:
n -= 1
i += 2
else:
if flowerbed[i+1]==1:
i += 3
else:
n -= 1
i += 2
return n==0
旋转矩阵
先进行纵向的上下翻转,再按照对角线翻转
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
length = len(matrix)
# 先在纵向上进行上下翻转
# 切片会创建新的对象进而开辟新地址
matrix[:] = matrix[::-1]
# 然后沿对角线翻转
for i in range(length):
for j in range(i):
matrix[j][i], matrix[i][j] = matrix[i][j], matrix[j][i]
字符串轮转
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
解题思路:如果s2s是由s1轮转而成,则将s2解在自己后面,s1一定在这个新的字符串中。
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
return len(s1) == len(s2) and s1 in s2*2
返回倒数第k个节点
实现一种算法,找出单向链表中倒数第k个节点,返回该节点的值。
双指针解法
设置两个指针,令第一个指针先走k步,然后第二个指针开始走,当第一个指针为空时,第二个指针到达倒数第k个数。
class Solution:
def kthToLast(self, head: ListNode, k: int) -> int:
a=head
b=head
for i in range(k):
b=b.next
while b:
a=a.next
b=b.next
return a.val