纯小白,纯记录,大佬勿喷Day3今天能把这二十道入门题完成吗?如完
前言
其实也不清楚学到哪里,要学什么,要从事哪个行业,甚至我喜不喜欢我都不清楚,但是想做便去做吧,顾虑太多反而不好了,就权当是打发这令人厌烦枯燥的时光吧
正如每个新人在接触编程时候笨拙的第一句hello world**
326.3的幂
延续上一题2的幂的思路,我们也不妨会想到取整..和取余%完成我们循环,但是这个循环还是很精妙,我代码翻译还是不行,这里else是可以删除的,也不影响判断
class Solution: def isPowerOfThree(self, n: int) -> bool:
if n <= 0:
return False
else:
while n % 3 == 0:
n //= 3
return n == 1 #缩了一个判断
其实回归到本质上来,无非就是能整除3,和不能整除3的,能整除的里面包含不是3的幂,只是3的倍数,最后只剩下余数的,而且余数绝对非0,不能整除的更简单了,一上来就有余数,先把负数和0讨论了,只需要写剩下的逻辑判断就好了,先把里面蕴含3的全部给去除,不就是整除3的循环吗,也就是说,n //= 3 是在循环里面的,但什么时候截止呢,当然是没法被整除了,翻译一下就是有余数,那么条件也写出来了,上文也写了如何判断是不是3的幂,就看最后的余数是不是1
这么一回顾,貌似,那张纸,画画图,连连线,归归类,更加清楚了——分类讨论恐怖如斯
递归,这块调用代码,复制粘贴也没意思,这部分需要补补
再者还有取对数运算,这确实没想到
看完了我的思路,我们还是看看大佬的思路吧,恐怖如斯……
class Solution:
def isPowerOfThree(self, n: int) -> bool:
return n > 0 and 1162261467 % n == 0
"""
作者:灵茶山艾府 链接:https://leetcode.cn/problems/power-of-three/solutions/2974674/o1-shu-xue-zuo-fa-yi-xing-gao-ding-pytho-w0uh/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"""
但是思路却和上一题2的幂有点相似,都是发现一个独一无二的性质,便可以把复杂问题简单化。
231 <= n <= 231-1限定了一个范围,也就是说他不是无限放大的,而是有上限的,只要在这个上限内满足条件即可,其实从这里也能略微品味为什么这分在因数和倍数里面了,确实如此,幂运算中小的幂被大的幂所蕴含,为大幂的因数,而不是他的幂是不能被整除的
又长见识了,数论吗有点意思
还有高手其实
class Solution:
def isPowerOfThree(self, n: int) -> bool:
return n == 1 or n == 3 or n == 9 or n == 27 or n == 81 or n == 243 or n == 729 or n == 2187 or n == 6561 or n == 19683 or n == 59049 or n == 177147 or n == 531441 or n == 1594323 or n == 4782969 or n == 14348907 or n == 43046721 or n == 129140163 or n == 387420489 or n == 1162261467
完赛永远比半途而废要好啊,这又怎么说不是一种解决办法呢?甚至这种打表还有不用写法
class Solution: def isPowerOfThree(self, n: int) -> bool:
powers = [ 1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467]
return n in powers
# wxyz大佬打表 https://leetcode.cn/u/priceless-poincaresxe/
其实到这里,完全就如数学题一样了,答题思路有不同,就算相同的思路,最后写出来的代码实现路径也不同
漫漫长路,上下求索
丑数
class Solution:
def isUgly(self, n: int) -> bool:
if n <= 0:
return False
while n % 2 == 0:
n //= 2
while n % 3 == 0:
n //= 3
while n % 5 == 0:
n //= 5
return n == 1
超出时间限制……很讨厌了
那只用换个思路了,其实也还比较好,3个循环浪费时间,那就减去循环数量,就好了,前面恰好也做了3的幂和2的幂
3的幂1162261467 % n == 0
2的幂 n& (n-1) == 0还是轻松的
1470.重新排列数组
其实一上来就有个想法,就是把这个列表对半分,然后你摘一个,我摘一个
class Solution:
def shuffle(self, nums: List[int], n: int) -> List[int]:
x = nums[:n]
y = nums[n:]
final = []
k = 0
for i in range(n):
final.append(x[i])
final.append(y[i])
return final
当然也可以缩写成这样
return [num for i in range(n) for num in (nums[i], nums[n+i])]
amazing!
867.转置矩阵
我记得python好像一个库就是干这个工作的,专门解决矩阵问题
这道题思路,其实我感觉还好,把转这个动作翻译成为遍历,也就是把行变成列,同时角标不变
但奈何我是真不会基础知识
class Solution: def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
m, n = len(matrix), len(matrix[0])
ans = [[0] * m for _ in range(n)]
for i, row in enumerate(matrix):
for j, x in enumerate(row):
ans[j][i] = x
return ans
"""
作者:灵茶山艾府 链接:https://leetcode.cn/problems/transpose-matrix/solutions/3655185/jian-dan-ti-jian-dan-zuo-pythonjavaccgoj-5ipt/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"""
1422.分割字符串的最大得分
看到这道题其实也是比较好翻译的
class Solution:
def maxScore(self, s: str) -> int:
score = []
n = len(s)
for i in range(1,n):
left = list(s[:i])
right = list(s[i:])
score.append(left.count("0") + right.count("1"))
return max(score)
优化
1.对于递归的学习
2.关于幂的运算,取对数,最大幂”吃掉“小幂,打表(穷举法)的熟悉
3.利用 n == 1进行bool运算
错题集
【错误】return结果放在循环内;【订正】记住要的是最后的结果,需要等循环结束,放在循环外
【错误】基础语法不知;【订正】菜鸟教程
【错误】range(1:n);【订正】不是列表,是range(1,n)

浙公网安备 33010602011771号