python(牛客)试题解析1
作者:互联网
一、NC103翻转字符串数组
叙述:写出一个程序流程,接纳一个字符串数组,随后导出该字符串数组翻转后字符串数组。(字符串数组长度不得超过1000)
实例:键入:"abcd",导出传参:"dcba"
分析1:转走字符串数组里的物质组成目录,并翻转目录,再度导出为字符串数组
classSolution:
defsolve(self,str:str)->str:
#writecodehere
list1=[]
foriinstr:
list1.append(i)
list1.reverse()
s=""
foriinlist1:
s=s+i
returns
分析2:运用字符串数组的切成片倒序导出
classSolution:
defsolve(self,str:str)->str:
str1=str[::-1]
returnstr1
二、NC141确定是否为回文字符串数组
叙述:给出一个长度为n的字符串数组,请撰写一个函数分辨该字符串数组是不是回文。假如是回文请返回true,不然回到false。字符串数组回文指该字符串正序与其说反序逐标识符一致。
实例:键入:"absba",传参:true;键入:"ranko",传参:false
分析1:翻转字符串数组,并提高分辨
classSolution:
defjudge(self,str:str)->bool:
str1=str[::-1]
ifstr1==str:
returnTrue
else:
returnFalse
分析2:应用三母关系式简单化导出
classSolution:
defjudge(self,str:str)->bool:
returnTrueifstr[::-1]==str[:]elseFalse
三、NC151 最大公约数
叙述:如果有一个当然数a会被整数b能整除,则认为a为b的倍率,b为a的约数。好多个整数公有制的约数,称为这些自然数的公约数。公约数中最大的一个公约数,称之为这些自然数的最大公约数。键入a 跟b,请返回a 跟b 的最大公约数。
实例:键入3,6,回到3;键入8,12,回到4
分析1:根据因式分解取下每一个数的质因数,随后赋值寻找2组质因数里边同样的质因数,最终根据乘积获得最大公约数
classSolution:
defgcd(self,a:int,b:int)->int:
#a=30
#b=40
res1=[]
res2=[]
res3=[]
#因式分解
whilea>1:
foriinrange(a-1):
k=i+2
ifa%k==0:
res1.append(k)
a=int(a/k)
break
#print(res1)
whileb>1:
foriinrange(2,b+1):
ifb%i==0:
res2.append(i)
b=int(b/i)
break
#print(res2)
foriinrange(0,len(res1)):
ifres1[i]inres2:
res3.append(res1[i])
res2.remove(res1[i])
res=1
foriinres3:
res=res*i
#print(res)
returnres
分析2:奔走相加减法,计算起来也是简约:源于《九章算术》的一种求最大公约数的优化算法,它本来是为约分量身定做的,但是它适用一切必须求最大公约数的场所,以比较大的数减比较小的数,然后把所获得的差与比较小的数较为,并且以绝大多数减少数。再次这种操作,直至所获得的减数和差相同才行。则第一步大约完的多个2的积与第二步中等水平数字的相乘便是所愿的最大公约数
classSolution:
defgcd(self,a:int,b:int)->int:
t=0
m=0
n=0
#奔走做差加减法
ifa==b:
t=a
else:
m=max(a,b)
n=min(a,b)
t=m-n
whilen!=t:
m,n=max(n,t),min(n,t)
t=m-n
returnt
四、NC65斐波那契等差数列
叙述:规定键入一个整数n,麻烦你导出斐波那契等差数列的第n项,且第一个和第二个数据均是1
实例:键入4,依据斐波那契等差数列的概念得知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,因此回答为3。
分析1:应用递归算法的形式,但由于时间复杂度比较高,当数据信息比较大的,运转的时间比较长
classSolution:
defFibonacci(self,n:int)->int:
ifn==1orn==2:
return1
elifn==3:
return2
else:
returnself.Fibonacci(n-1)+self.Fibonacci(n-2)
分析2:应用for周而复始的方法,运用纪录中间变量temp防止了反复测算
classSolution:
defFibonacci(self,n:int)->int:
a,b=1,1
ifn<=1:
return1
else:
foriinrange(2,n):
tmp=a+b
a=b
b=tmp
returnb
五、键入一个由n个英文大小写所组成的标识符,按Ascii码值从小到大排序,查找字符串中第k个最少Ascii码系数的英文字母