不知道现在刷题还来不来得及,看到有人说一个月认真刷就行,所以就想试试,万一呢
准备从今天开始,按顺序认真刷题并记录过程中的一些小点
python列表操作:
nums.remove(3)
“3”表示数值,并且只能删除nums中第一个3
nums.pop(3)
"3"表示索引,pop表示删除nums中第四个位置上的数据(python序列索引从0开始)
nums.index(3) nums.sort()
index表示数值“3”在nums中的索引,sort表示将nums中数值从小到大排列
然后就是哈希矩阵,一开始不懂,后来找了一些,发现就是先找有没有这个值,如果没有就按(Key,Value)存进去
存数值用这个:
hashMap[Value]=Key
查找用这个:
hashMap.get(3)
之后又看到了一个求a+b+c=0,看了解题思路,可以换成a+b=-c,然后结合上面的hashMap,我就整理了一个代码,运行以后发现还要除去重复的数字,就卡在这一步了,后来想想,可以通过赋值,一组一组的赋值过去,同时进行排序,来检查是否存在相同的序列。
题目:
我的代码:
nums = [-1, 0, 1, 2, -1, -4]
b = []
hashMap = {}
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if hashMap.get(-nums[i] - nums[j]) is not None:
b.append([nums[i], nums[j], -nums[i] - nums[j]])
hashMap[nums[j]] = j
hashMap = {}
a = []
for i in b:
i.sort()
if i not in a:
a.append(i)
print(a)
结果:
再之后又有一个删除顺序数组的问题,我就想用a存储数据,如果有相同的就remove掉,但是因为sums长度变化导致 i 的取值有变化,所以没有调试成功先放这吧
nums = [1, 1, 2]
a = nums[0]
for i in range(1, len(nums)):
if nums[i] == a:
nums.remove(i)
i = i-1
else:
a = nums[i]
print(nums)
然后看了参考答案觉得,有时候如果 = 不好用,可以换思路试试 !=,两道题下来,觉得双指针挺方便的,,
再再之后,看到一个给0移位的题,这个题吧,唉,主要是我不知道python可以直接交换值,
nums[right], nums[left] = nums[left], nums[right]
所以我就用之前C的方法,但是又不想再加一个参数,就后面用append加0
nums = [0, 1, 0, 3, 5]
right, left = 0, 0
for left in range(len(nums)):
if nums[left] != 0:
nums[right] = nums[left]
right += 1
c = len(nums) - right
nums = nums[0:right]
for i in range(c):
nums.append(0)
print(nums)
要么python广泛,,里面有的东西真的很方便
enumerate 表示枚举,可以直接将数组换成 索引-值的形式,但是这个只能是看了才知道
再再再之后又看了一个题,把数组的最后一位加一,我一开始看,完全没想到要进位,,,还觉得参考答案给的复杂,但是看了一遍答案,突然发现要进位,然后在我的基础上进行修改
nums = [1, 9, 9]
a = len(nums)
b = 0
for i in range(a):
a = a - 1
b = b + nums[a] * 10 ** i
b = b + 1
c = [int(x) for x in str(b)]
print(c)
这里有几个点,a[:-1] 表示去掉最后一个数, a[::-1] 表示将数组倒序
如果想将数字拆成数组,可以用 [int(x) for x in str(b)]
但是还是需要把参考答案再看一看 ,不能只靠自己已经有的东西,虽然一道题可以有很多解法,最好还是找到最简捷的
再再再再之后,有一个有序拼接两个数组的题,我一开始想用 append ,但是发现那是整体加入的,所以换成了 extend ,这个是只插入元素,但是后来又发现输入数组有0,拼接排序以后有0,所以还是换成了数组赋值,再 sort 排序。
nums1 = [1, 2, 3, 0, 0, 0, 0]
nums2 = [1, 5, 6, 8]
m, n = 3, 4
nums1[m:] = nums2[:]
nums1.sort()
print(nums1)
顺便复习一下,pop() 是删除元素,remove() 是删除索引。
总结一下,就是前面不行看后面,等于不行用不等于。还有不要以为自己写的少就好,可能是自己的有bug。。。
再再再再再之后,是一个选两个板盛水最多的容器,这个要找左右夹击的就不需要循环,用双指针就可以。最大不行用最小。
还要max,min的熟练运用,a = max(a, b),a = min(a, b)
再再再再再再之后,是一个接雨水,和上面的区别在于这个水被分开了,,,啊,崩溃,,,
这个题可以用实时动态存储,a = max(a, b),但是也是一个个的拿出来和它左右最大值做对比,不能贪心。另一个方法是利用栈,熟练运用pop,append,主要先找到上升趋势,然后再一个个pop掉,依次求面积
再再再再再再再之后,是一个旋转数组和整数反转,旋转数组要求有三个方法,我放到第二篇里了,可以利用负负得正的方法,三次反转,以k为界。整数反转难在负数,哦,对,这里要说,enumerate只能对数组枚举,对一个整数不行,还有python中取整符号是 // ,还有整数拆开用 list(str(num)) ,我看参考答案有点长,下面这个是我自己的
nums = -120
a = 0
if nums < 0:
nums = nums * -1
while nums > 0:
a = 10 * a + nums % 10
nums = nums // 10
else:
while nums > 0:
a = 10 * a + nums % 10
nums = nums // 10
nums = a
print(nums)