废话不多说,人生苦短我用python 立下此贴作为学习见证以及补充
刷题顺序就从TOP100开始刷起 之前刷的25道 回顾的时候再补充上,先从简单题刷起来
一.矩阵旋转问题
1.1 题目说明
给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像
实例:
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
1.2思路
按照题目要求,不可以使用另一个矩阵,那么其操作大多数为矩阵内互换位置,经过思考,若要求矩阵顺时针旋转90度,实际操作两部分即可完成:
1.matrix[i,j],matrix[j,i] = matrix[j,i],matrx[i,j] ##对原矩阵进行转置变化
2.matrix[i][j],matrix[i][len(matrix)-1-j] = matrix[i][len(matrix)-1-j],matrix[i][j] ##通过对列遍历一半 实现对列的更换
1.3 源码如下
class Solution:
def rotate(self, matrix):
"""
Do not return anything, modify matrix in-place instead. 先转置,在换列
"""
for x in range(len(matrix)): #行列互换转置 matrix[i][j],martix[j][i] = matrix[j][i],matrix[i][j] 利用python的换值机制,两个值同时互换
for y in range(x,len(matrix)):
matrix[x][y],matrix[y][x] = matrix[y][x],matrix[x][y]
for i in range(len(matrix)): #列取反 matrix[i][j] = matrix[i][len(matrix)-1-j] 数组运算中需要减1,由于其从0计算
for j in range(int(len(matrix)/2)):
matrix[i][j],matrix[i][len(matrix)-1-j] = matrix[i][len(matrix)-1-j],matrix[i][j]
return matrix
if __name__ == "__main__":
leecode = Solution()
result = leecode.rotate([[1,2,3],[4,5,6],[7,8,9]])
print(result)
1.4 补充 :日后留坑
二.汉明距离问题
2.1 题目说明
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。
注意:
0 ≤ x, y < 2^31.
示例:
输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
共有两个位置不同
2.2 思路
1.将x,y 分别转化为二进制list
2.求出x,y list的差值list_result
3.对list_result进行遍历,判断其中值为1的个数,作为输出
2.3 源码
class Solution:
def hammingDistance(self, x: int, y: int) -> int:
x_conversion,y_conversion,result = [],[],[]
cout = 0
while x//2 != 0: #x 二进制转化
x,tmp = divmod(x,2)
x_conversion.append(tmp)
x_conversion.append(x)
while y//2 != 0: #y 二进制转化
y,tmp = divmod(y,2)
y_conversion.append(tmp)
y_conversion.append(y)
x_len,y_len = len(x_conversion),len(y_conversion)
if x_len>y_len:
for i in range(x_len-y_len):
y_conversion.append(0)
elif x_len<y_len:
for i in range(y_len-x_len):
x_conversion.append(0)
result = [x_conversion[i] - y_conversion[i] for i in range(len(x_conversion))]
for i in range(len(result)):
if result[i] != 0:
cout += 1
return cout
if __name__ == "__main__":
leecode = Solution()
print(leecode.hammingDistance(11,6))
运行结果如下图
2.4 补充
看了看其他大神的思路。。。瞬间感觉自己跟个傻子一样。。。
人家只用了一句话
return bin(x ^ y).count('1')
其中bin为python 当中的内置函数,作用为将其变为二进制数值
python中 ^表示异或,不相同即为1,两个整数经过异或,即现其转化为二级制,对位异或后再转化为10进制即 4^2 值为 6
.count 即为计算值为1的个数。。天啊,牛皮
三 只出现一次的数字number/)
3.1 问题描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例:
输入: [2,2,1]
输出: 1
3.2 思路
暴力求解法:
python 中有个很暴力的除重方法,他的名字叫set
1.通过set 对原数组去重
2.对set中的值进行遍历,利用count,查看是否在原数组中出现次数为1
3.是1的话,即输出
理所应当的爆炸了,原因在于。。python那部分计算耗费时间太多,超时了
哈希方法
1.对原数组进行遍历,构建哈希表
2.key为原数组值,value为出现次数,通过dict.get函数查找key。若之前不存在则为1,若之前存在即为1+1=2
3.对构建的哈希表进行遍历,遍历其key值,若key ==1 输出其val
这个能沟通过,利用的是哈希表查找速度邀标 暴力count速度快
源码
class Solution(object): ## 暴力法
def singleNumber(self, nums):
num_set = set(nums)
for num in num_set:
if nums.count(num) == 1:
return num
if __name__ == "__main__":
leecode = Solution()
print(leecode.singleNumber([100,100,1]))
class Solution(object): ## 哈希方法
def singleNumber(self, nums):
nums_dict = {}
for num in nums:
nums_dict[num] = nums_dict.get(num,0) + 1
for key,val in nums_dict.items():
if val == 1:
return key
if __name__ == "__main__":
leecode = Solution()
print(leecode.singleNumber([100,100,1]))
3.3 补充
神来之笔。。看了大神的算法 我又哭
set 去重
对去重部分求和
减去原数组求和!
牛皮!