13道Python数组练习题
1、⼆维数组的查:
在⼀个⼆维数组中(每个⼀维数组的长度相同),每⼀⾏都按照从左到右递增的顺序排序,每⼀列都按照从上到下递增的顺序排序。请完成⼀个函数,输⼊这样的⼀个⼆维数组和⼀个整数,判断数组中是否含有该整数。
class Solution:
def Find(self, target, array):
rows =len(array)-1
cols =len(array[0])-1
i = rows
j =0
while i >=0and j <= cols:
if target < array[i][j]:
i -=1
elif target > array[i][j]:
j +=1
else:
return True
return False
2、旋转数组的最⼩数字
把⼀个数组最开始的若⼲个元素搬到数组的末尾,我们称之为数组的旋转。 输⼊⼀个⾮减排序的数组的⼀个旋转,输出旋转数组的最⼩元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的⼀个旋转,该数组的最⼩值为1。 NOTE:给出的所有元素都⼤于0,若数组⼤⼩为0,请返回0。
class Solution:
def minNumberInRotateArray(self, rotateArray):
lens =len(rotateArray)
if lens ==0:
return0
elif lens ==1:
return rotateArray[0]
else:
left =0
right = lens-1
while left < right:
mid =(left+right)//2
if rotateArray[mid]<= rotateArray[right]:
right = mid
else:
left = mid+1
return rotateArray[right]
3、斐波那契数列
⼤家都知道斐波那契数列,现在要求输⼊⼀个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:531509025
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
class Solution:
def Fibonacci(self, n):
fib =[0,1]
if n <=1:
return fib[n]
while len(fib)<=n:
fib.append(fib[-1]+fib[-2])
return fib[n]
4、跳台阶
⼀只青蛙⼀次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上⼀个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
class Solution:
def jumpFloor(self, number):
ways =[1,2]
if number <=2:
return ways[number-1]
while len(ways)<=number:
ways.append(ways[-1]+ways[-2])
return ways[number-1]
5、变态跳台阶
这道题纯粹是为了和前⼀题对⽐,放在数组这篇博客⾥。⼀只青蛙⼀次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上⼀个n级的台阶总共有多少种跳法。
class Solution:
def jumpFloorII(self, number):
if number <=1:
return number
else:
way =1
for i in range(2,number+1):
way *=2
return way
6、矩形覆盖
和斐波那契数列的思路差不多。我们可以⽤21的⼩矩形横着或者竖着去覆盖更⼤的矩形。请问⽤n个21的⼩矩形⽆重叠地覆盖⼀个2*n的⼤矩形,总共有多少种⽅法?
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:531509025
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
class Solution:
def rectCover(self, number):
ways =[0,1,2]
if number <=2:
return ways[number]
else:
while len(ways)<= number:
ways.append(ways[-1]+ways[-2])
return ways[number]
7、数值的整数次⽅
给定⼀个double类型的浮点数base和int类型的整数exponent。求base的exponent次⽅。
# -*- coding:utf-8 -*-
class Solution:
def Power(self, base, exponent):
temp =1
if base ==0:
return0
elif base !=0and exponent ==0:
return1
elif base!=0and exponent >0:
for i in range(exponent):
temp *= base
return temp
else:
for i in range(-exponent):
temp *=1./ base
return temp
8、调整数组顺序使奇数位于偶数前⾯
输⼊⼀个整数数组,实现⼀个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
class Solution:
def reOrderArray(self, array):
if not array:
return[]
odd_list =[]
even_list =[]
for i in array:
if i %2!=0:
odd_list.append(i)
else:
even_list.append(i)
return odd_list+even_list
9、顺时针打印矩阵
输⼊⼀个矩阵,按照从外向⾥以顺时针的顺序依次打印出每⼀个数字,例如,如果输⼊如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:531509025
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
class Solution:
def printMatrix(self, matrix):
res =[]
while matrix:
res += matrix.pop(0)
if matrix and matrix[0]:
for row in matrix:
res.append(row.pop())
if matrix:
res += matrix.pop()[::-1]
if matrix and matrix[0]:
for row in matrix[::-1]:
res.append(row.pop(0))
return res
10、数组中出现次数超过⼀半的数字
数组中有⼀个数字出现的次数超过数组长度的⼀半,请出这个数字。例如输⼊⼀个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的⼀半,因此输出2。如果不存在则输出0。
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
if not numbers:
return0
lens =len(numbers)
count_freq ={}
for i in numbers:
if i not in count_freq:
count_freq[i]=1
else:
count_freq[i]+=1
for key,value in count_freq.items():
if value >(lens//2):
return key
return0
11、连续⼦数组的最⼤和
HZ偶尔会拿些专业问题来忽悠那些⾮计算机专业的同学。今天测试组开完会后,他⼜发话了:在古⽼的⼀维模式识别中,常常需要计算连续⼦向量的最⼤和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如: {6,-3,-2,7,-15,1,2,2},连续⼦向量的最⼤和为8(从第0个开始,到第3个为⽌)。给⼀个数组,返回它的最⼤连续⼦序列的和,你会不会被他忽悠住?(⼦向量的长度⾄少是1)。
借鉴⾃然语⾔处理中的ngram的做法。
class Solution:
def FindGreatestSumOfSubArray(self, array):
def get_ngram(array):
n =len(array)
m =1
n_gram =[array[i-k:i]for k in range(m,n+1)for i in range(k,n+1)]return n_gram
def find_max(array):
n_gram = get_ngram(array)
sum_n_gram =[sum(i)for i in n_gram]
max_sum = sum_n_gram[0]
for i in sum_n_gram:
if i >= max_sum:
max_sum = i
return max_sum
if not array:
return
else:
return find_max(array)
12、把数组排成最⼩的数
输⼊⼀个正整数数组,把数组⾥所有数字拼接起来排成⼀个数,打印能拼接出的所有数字中最⼩的⼀个。例如输⼊数组{3,32,321},则打印出这三个数字能排成的最⼩数字为321323。
这个题在python3环境下,要调⽤⼀个函数cmp_to_key。
from functools import cmp_to_key
python新手代码练习class Solution:
def PrintMinNumber(self, numbers):
if not numbers:
return''
def compare(a,b):
if a+b > b+a:
return1
elif a+b < b+a:
return-1
else:
return0
numbers =[str(i)for i in numbers]
numbers.sort(key=cmp_to_key(compare))
return''.join(numbers).lstrip('0')
13、丑数
把只包含质因⼦2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因⼦7。 习惯上我们把1当做是第⼀个丑数。求按从⼩到⼤的顺序的第N个丑数。
这道题真是神题,暂时理解不了,抄别⼈的代码。
class Solution:
def GetUglyNumber_Solution(self, index):
if index <1:
return0
res =[1]
t2=t3=t5=0
nextIdx =1
while nextIdx < index:
minNum=min(res[t2]*2,res[t3]*3,res[t5]*5)
res.append(minNum)
if res[t2]*2== minNum:
t2 +=1
if res[t3]*3== minNum:
t3 +=1
if res[t5]*5== minNum:
t5 +=1
nextIdx +=1
return res[nextIdx-1]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论