纯小白,纯记录,大佬勿喷Day2上道了一点,也只是那么一点点
前言
其实昨天就想把这二十道题全部并记录完的,但是搭一个半成品blog死活搭不成了
原因出在:博客园还是github对于访问有一定的限制,如果后台加入太多图片,自己的blog就过载,把一大块内容全部删除,然后就需要把原js代码替换,把里面重新填写,并且一步步小心别超过阈值,具体原因其实可以研究一下的,不过毕竟都AI时代了,很多东西知道学会原理最优先的,我们还是往下看吧
但是这里还是贴一下我自己和AI讨论出来的答案吧:
博客园后台配置区域的「字符数上限限制」,其次是 GitHub 链接的间接影响,容易断联
核心解决思路是:精简图片链接(github地址替换为cdn.jsdelivr.net、控制图片数量、拆分配置区域、去掉冗余注释
其实也有一个钞能力的办法,自己买个服务器和域名玩去是了hh
但是这里还是需要提醒我自己,注意时间概念,这么一个小问题,昨天花了五个小时,今上午两个小时,确实耽误事情,但是一不小心哎嘿
下次注意,我们接着看题=)
1512.对数的数目
感觉回到了高中,高中数学经常会有这种拓展题
class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
n = len(nums)
count = 0
for i in range(n):
for j in range(i+1,n):
if nums[i] == nums[j]:
count += 1
return count
翻译条件得出代码,也是能写出一个暴力二重循环,时间复杂度为O(n2 )
为了学习的全面性,我还是说一下怎么翻译,来留下思考吧,首先这个i,j这两个都是一定变量,变化范围为,数组nums第一个到最后一个,没给准确的数,n为这个数组的数量,并且给他赋个值,计算好数对的数目,数数count,开始也需要定义一个count变量,记下来就需要遍历数组了,一个个来呗,i开始,遍历不就是for循环语句吗,循环数量一直到最后一个,range出来了,这时候该j了——其实这里也透露一个数学思想一个个来,控制自变量,再去研究因变量,j还需要从一开始开始吗,我想不需要,因为i < j 的。直接从i后面,什么是后面,i+1,再到最后一个都是,很简单循环写出来,并把最后一个条件(满足……)补上,大功告成
上面称为枚举法,大佬还对此优化了
还记得我们上道题,进行表示,最后消元成一个未知量的过程吗,这道题也是如此
要满足nums[i]=nums[j]那就记成k同时也要满足(i<j),k不知道多少个,count计数也不知道,那就记成v,那么出现次数满足好数组的,就是v(v-1)/2,怎么出来的呢?k出现了v次,也就是位置,对于排列来说,i就可以是v个位置,但是j>i,因此是(v-1)个位置,同是顺序固定,要除以二(或者换个说法,用组合理解,这些确实需要一些数学知识与经验,实在不行举举例子,咱们通过观察易知呢)
这里涉及到一个新名词叫做哈希表——字典、映射,翻译成人话就是,统计数目
例:{1,1,2,3,1,4,2}变为哈希表就为{1:3,2:2,3:1,4:1},前者叫做键,后者叫值,理解清楚之后,再对python简洁代码有一些了解,也不难写出这样的代码,看我也没用,我是个小白,里面collections.counter 也没用过
class Solution:
def numIdenticalPairs(self, nums: List[int]) -> int:
m = collections.Counter(nums)
return sum(v * (v - 1) // 2 for k, v in m.items())
但是现在见过了,就能建立起,collection.Counter好像输频次统计的,item和键值对相关……然后痛斥心扉!必须看看哈希表的内容了
1534.统计好三元组
class Solution:
def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
count = 0
n = len(arr)
for i in range(n):
for j in range(i+1,n):
for k in range(j+1,n):
if (abs(arr[i]- arr[j]) <= a) and (abs(arr[j] - arr[k]) <=b) and (abs(arr[i] - arr[k]) <= c):
count += 1
return count
依旧暴力,依旧翻译,目前翻译能力还是可以的,尽管很丑陋,但是能跑就是胜利(bushi)
很荣幸这次和大佬的方法一差不多,但是时间复杂度由于for循环嵌套上升到了O(n3)
这里大佬也给出了
”⚠注意:如果你刚开始刷题,掌握方法一即可,后面的方法可以等刷到对应题单再来学习。“
可是,无视风险,继续安装!
前缀和、排序 + 枚举中间 + 三指针………………
好,大佬说的对,继续是最重要滴,下一题
584.寻找用户推荐人
这里到了数据库(sql语句),大佬说可以不做,但是我还是看看吧,简单题能有多难呢?
# Write your MySQL query statement below
SELECT name
FROM Customer
WHERE referee_id != 2 or referee_id is null
sql语言如上
但是puthon当中也有强大的库(当然也可以做胶水粘合)
import pandas as pd # pandas库提供强大数据分析
def find_customer_referee(customer: pd.DataFrame) -> pd.DataFrame:##返回表
row = customer['referee_id'].isna() | (customer['referee_id'] != 2) # null与!=2,然后还有运算层级的事情 不加括号运算顺序会发生变化
col = ("name",)#必须有,以表示输出的是这一列
return customer.loc[row,col]#loc进行筛选
调用pandas库,也类似于字典呢,库的学习也需要提上日程了
1757. 可回收且低脂的产品
# Write your MySQL query statement below
SELECT product_id
FROM Products
WHERE low_fats = "Y" and recyclable = "Y"
这里也犯蠢了,表光写错product Product……
我们还是看看代码规范吧
节选自评论区橡树大佬
1.关键字大写,保持统一。
2.保持良好的换行,便于理清楚逻辑。
3.and,or,逗号等我放在行首,这样的好处是增加删除条件时比较方便,否则删除最后一个条件还要去上一行末删除关联词。
4.不用保证符号对齐, where条件field对齐即可。
5.尽量查询的field前加上表的简称,提高代码可读性,一目了然。
当然更多的可以豆包启动,但毕竟看到了,也在这里提醒我自己吧
毕竟都看到了pandas了,也看看python如何实现吧
import pandas as pd
def find_products(products: pd.DataFrame) -> pd.DataFrame:
col = ("product_id",)
row = (products["low_fats"] =="Y") & (products["recyclable"]=="Y")
return products.loc[row,col]
不得不感叹很多时候sql和pandas容易弄混,报错好几次,修了好几次,包括但不限于
["xxxx",] row = products("xxxx",)
("xxxx")
row = products["low_fats"=="Y"] & products["recyclable"=="Y"]
或许单独学是比较好,不过DB也就这两道了
709. 转换成小写字母
这个真就是轻松加愉快了
class Solution:
def toLowerCase(self, s: str) -> str:
return s.lower()
原来我也能写出这么简单的代码hh笑死🤣
我们不妨再看看其他大佬的代码
class Solution: def toLowerCase(self, str: str) -> str:
str=str.replace("A","a").replace("B","b").replace("C","c").replace("D","d").replace("E","e").replace("F","f").replace("G","g").replace("H","h").replace("I","i").replace("J","j").replace("K","k").replace("L","l").replace("M","m").replace("N","n").replace("O","o").replace("P","p").replace("Q","q").replace("R","r").replace("S","s").replace("T","t").replace("U","u").replace("V","v").replace("W","w").replace("X","x").replace("Y","y").replace("Z","z")
return str
## 作者:qianduzhineng 链接:https://leetcode.cn/problems/to-lower-case/solutions/197723/zhen-gao-ji-fang-fa-bu-jiu-26ge-zi-mu-ma-ai-ge-ti-/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
堪称精彩hh,稍作休息,下一道
258. 各位相加
这个一开始其实我就被难住了,因为不知道如何拆分出来我想要的各位(学艺不精),看了提示之后,才想起来,这么一串数字也可以作为str啊,利用str摘出来不就好了
class Solution:
def addDigits(self, num: int) -> int:
arr = list(str(num))
res = 0
for i in arr:
res += int(i)
if res < 10:
return res
else:
return self.addDigits(res)
但题目上升难度想要时间复杂度为O(1),我是真没招了,接着借阅大佬思路,模9,还有高手?数学啊,你是我的唯一……
有些时候真的不得不佩服这些人,脑子是怎么长得,我能做的也只是东施效颦了
在这里总结一下数学目前的发现的所谓的技巧吧,举例子,分类讨论,消元(控制变量),找规律(包括但不限于加减乘除,数列等)
他给的只是一个表象,而我们需要对此进行计算发现真正的规律,正如此题,取余大环境,是能想到的,但是模谁,按理来说就要往这方面去考,现在给你两个数,就要找这两个关系,那么四则运算总得试试吧,并且其实模模糊糊感觉,是感觉和多位数到个位数,那么结果也得划到个位数0~9上面来吧,先从简单开始
21➡️3 其中的变化18
55➡️10➡️1 其中的变化45 9
78➡️15➡️6 其中的变化63 9
看不出什么 ……阿妹怎啊!如此奇妙,
三位数呢
100➡️1
213➡️6 那么和9有关系,这大环境也知道是与模有关
275➡️14➡️5 看看模9呢
798➡️24➡️6 余6 非常amazing啊!这也太巧合了
很难想象,如果不给大环境,这确实是一道精妙的数学题,我的数学功底还是太差了
下面甚至还有神来一笔的整合,把复杂的分类讨论化简了,(num−1) mod9+1 和 0
漫漫长路我能走到哪一步呢?
1281.整数的各位积和之差
这道题至少看起来还简单一点,延续上面一道题
class Solution:
def subtractProductAndSum(self, n: int) -> int:
arr = list(str(n))
add_res = 0
mul_res = 1
for i in arr:
add_res += int(i)
mul_res *= int(i)
return (mul_res - add_res)
这里还犯了小错误,累乘首项怎么能为0呢
大佬还能不不用str?枚举数位,不用字符串
这下好了,mod 10了,上一题mod 9算是找规律吧,其实上一道题我也想了mod 10来着,但是算法不知道如何实现,因为上不封底,并且还有嵌套循环,确实很晕,好像实现不了,因为目的错了
mod 10目的取最后一位,数字最后一位的特征
mod 9是数论的弃9法,数字之和特征
这道题本质上就是找最后一位数的计算关系,前面的只有到下一步才计算,那么就是我们正常的//和%的循环,然后变成一个新的继续循环,且最后n=0➡️false循环终止(这里转换我记得也不是很熟)
class Solution:
def subtractProductAndSum(self, n: int) -> int:
p , s = 1,0
while n:
p *= n%10
s += n%10
n //= 10
return p - s
231.2的幂
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
if n <= 0:
return False
while n % 2 == 0:
n //= 2
return True if n == 1 else False
2的幂次方,有1 2 4 8 16等,判断不是只要不满足以下条件:1.负数 2.不能被2整除 3.循环整除最后不能到1(可能是3或者其他质数)——(这里涉及到了质数可能之后质数也有相应的应用?)
2是一个特别的数字(相应的 8 10 16等进制也是如此,之后遇到需要敏感一些),二进制也是关乎2的,而恰好,二进制每一个位上都是2的幂,关于二进制的运算,应该要很自然想到位运算(与或异或等)
00000001 1
00000010 2
00000100 4
00001000 8
2的幂恰好就1个1,反倒是多了1的,反而不满足条件了,想要把他们挑出来
00000011 3
00000110 6
00000111 7
移位运算好像并不好用,因为你不知道你要移动几位才符合条件,那只能是按位运算
这时候有引入一个,2的幂-1,很恰好后面数字反转
0 = 1-1 00000000
1 = 2-1 00000001
3 = 4-1 00000011
如果n是2的幂,n&(n−1) 一定为 0——刚好错位了,二分了,解决了
从集合论到位运算,常见位运算技巧分类总结!更多的还是看看这个吧,也是灵茶山艾府大佬写的
class Solution:
def isPowerOfTwo(self, n: int) -> bool:
return n > 0 and n & (n - 1) == 0
"""
作者:灵茶山艾府
链接:https://leetcode.cn/problems/power-of-two/solutions/2973442/yan-ge-zheng-ming-yi-xing-xie-fa-pythonj-h04o/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"""
最后还有犯蠢的,复制粘贴代码我看有换行全删了,没想到发出来成一行了,这就是经验吗hh
优化集
优化
- 变量赋值可以写在同一行
- 逻辑运算符可以用符号表示
- mod 9 mod 10区别
错题集
错题集
- 【错误】SQL 里判断 NULL 用了 = NULL,查不到结果;【铁则】NULL 只能用 IS NULL/IS NOT NULL 判断
- 【错误】pandas 多条件拼接没加括号,导致优先级出错;【铁则】每个条件单独加括号,再用 &/| 拼接
- 【错误】pandas对于引用列,忘,哈希表等知识遗忘;【补救】基本语法再看看
- 【错误】变量属性记不清;【铁则】先看清变量再写
- 【错误】做数字累乘题,初始值设为 0,导致结果永远为 0;【铁则】0加1乘
- 【错误】= 和 == 傻傻分不清;【铁则】==等于 = 赋值
- 【错误】and or not 与&|^使用场景判断错误;【铁则】逻辑是逻辑,位是位,不可弄混

浙公网安备 33010602011771号