零.写在前面
💗博主简介:大家好,我是MUSE,一个正在成长的Python博主小白!
😏博客主页:倒霉沙拉🥗
🔥 欢迎关注🙏点赞👍评论✉️收藏💝
💻系列介绍:本系列采用Python语言解决算法零基础100讲题目,相关文章可以关注专栏!
一.基础知识
今天的内容是关于一些素数的判定的,素数的判定离不开我们所学的每一门语言,而且素数的判定也有很多种方法,在介绍素数的判定之前,我们先需要搞定素数的定义;
1.1素数的定义
只能被常数1或自己整除,不能被其他整数整除的正整数。 任何一个正整数,都能被常数1或自己整除。且1不是素数,20以内的素数有[2,3,5,7,11,13,17,19]
1.2素数判定的算法设计
def isPrime(x):
if x==1:
return False
for i in range(2,int(sqrt(x))+1):
if x%i==0:
return False
return True
二.题目解析
1.回文素数(866)
class Solution:
def primePalindrome(self,n:int)->int:
def isPrime(x):
if x==1:
return False
for i in range(2,int(sqrt(x))+1):
if x%i==0:
return False
return True
def isPalindrome(x):
x=str(x)
left=0
right=len(x)-1
while left<right:
if x[left]!=x[right]:
return False
left+=1
right-=1
return True
while True:
if isPrime(n) and isPalindrome(n):
return n
n+=1
if 10**7<n<10**8:
n=10**8
✅解题思路:
1)理解题意,需要我们返回一个比给定的数大的回文素数中最小的;
2)根据题意,拆分理解,先写一个判断素数的程序,今天的重点内容,但只是这道题目的一部分,设计判断素数的方法的时候需要留意时间复杂度。
3)再写一个判断回文数的方法,用了两个指针,分别指向头和尾,判断对应位置的字符是否相等
4)主程序,根据给定的n的值去寻找,需要注意题目中给定的10^8的范围。
2.丑数(剑指Offer 49)
class Solution:
def nthUglyNumber(self,n:int)->int:
dp=[1]*n
a=b=c=0
for i in range(1,n):
n2,n3,n5=dp[a]*2,dp[b]*3,dp[c]*5
dp[i]=min(n2,n3,n5)
if dp[i]==n2:a+=1
if dp[i]==n3:b+=1
if dp[i]==n5:c+=1
return dp[-1]
✅解题思路:
1)这道题目使用了动态规划的方法,理解之后还是相对容易一些的;
2)我们的目的是为了找到第n个丑数(按照从小到大的顺序排列),那么每次我们需要排的都是最小的那一个,问题是我们该如何去寻找丑数?
3)我们知道1是一个丑数,因为丑数的因子只有2,3,5,那么之后的丑数也一定只是前一个丑数乘以2,3,5得到的;
4)我们设置三个指针,开始时均指向开头,之后分别跟着对应的因子的最小值去移动,每次放入的是最小值的话就对该指针往前+1;
5)循环结束后返回列表最后一个值即可。
三.写在后面
今天的题目有两道,与素数的判定有一定的相关,但也只是其中很小的一部分,素数的判定是学习语言的必经之路,我们会不断的对其进行优化,今天的题目可以帮助大家更好的理解素数在其中的判断。