0
点赞
收藏
分享

微信扫一扫

Python多方法求解:输入数组的连续子数组的最大和/求方幂/寻找数组中出现次数最多的元素


文章目录

  • ​​1 问题1​​
  • ​​1.1 问题描述​​
  • ​​1.2 程序代码​​
  • ​​1.2.1 方法1​​
  • ​​1.2.2 方法2​​
  • ​​1.2.3 方法3​​
  • ​​2 问题2​​
  • ​​2.1 问题描述​​
  • ​​2.2 程序代码​​
  • ​​2.2.1 方法1​​
  • ​​2.2.2 方法2​​
  • ​​3 问题3​​
  • ​​3.1 问题描述​​
  • ​​3.2 程序代码​​
  • ​​3.2.1 方法1​​
  • ​​3.2.2 方法2​​
  • ​​3.2.3 方法3​​
  • ​​3.2.4 方法4​​

1 问题1

1.1 问题描述

给定一个整数数组number,找出一个具有最大和的连续子数组,输出最大和。
例如:
输入:[-2,1,-3,4,-1,2,1,-5,4]
输出:6

1.2 程序代码

1.2.1 方法1

def fun(inputs):
length=len(inputs)
if length==1:
return inputs[0]
maximum=sum(inputs) #假设数组的和最大
for i in range(0,2): #长度为length的数组有两个长度为length-1的连续子数组,索引分别为0:length-2和1:length-1
if maximum<fun(inputs[i:length-1+i]): #数组之和与连续子数组之和比较,取最大值
maximum=fun(inputs[i:length-1+i])
return maximum # 返回值为数组之和与自己的两个连续子数组之和(如果有)的最大值

if __name__=='__main__':
inputs = [] # 存储输入的整数
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while (temp != 'q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数组长度为' + str(len(inputs)) + ',如下:')
print(inputs)
print('连续子数组的最大和为:'+str(fun(inputs)))

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:-2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:-3
请输入数据,若输入完毕,请输入'q'
:4
请输入数据,若输入完毕,请输入'q'
:-1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:-5
请输入数据,若输入完毕,请输入'q'
:4
请输入数据,若输入完毕,请输入'q'
:q
您输入的数组长度为9,如下:
[-2, 1, -3, 4, -1, 2, 1, -5, 4]
连续子数组的最大和为:6

1.2.2 方法2

def fun(inputs):
n=len(inputs)
s=[[0 for i in range(n)]for i in range(n)]
for i in range(n):
s[i][i]=inputs[i]
for i in range(n-1)[::-1]: # 自底向上,从左到右计算数组s
for j in range(i+1,n):
x=int((i+j)/2)
s[i][j]=s[i][x]+s[x+1][j]
print("辅助的二维数组s如下:")
for i in range(n):
print(s[i])
max=s[0][0] # 设置max的初始值
ii=jj=0 # max的两个索引
for i in range(n):
for j in range(i,n):
if max<s[i][j]:
max=s[i][j]
ii=i
jj=j
return (max,ii,jj)

if __name__=='__main__':
inputs = [] # 存储输入的整数
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while (temp != 'q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数组长度为' + str(len(inputs)) + ',如下:')
print(inputs)
max,i,j = fun(inputs)
print('---------')
print('连续子数组的最大和为:'+str(max)+',这是从第'+str(i+1)+'个元素到第'+str(j+1)+'个元素的和')

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:5
请输入数据,若输入完毕,请输入'q'
:-1
请输入数据,若输入完毕,请输入'q'
:-5
请输入数据,若输入完毕,请输入'q'
:9
请输入数据,若输入完毕,请输入'q'
:q
您输入的数组长度为5,如下:
[3, 5, -1, -5, 9]
辅助的二维数组s如下:
[3, 8, 7, 2, 11]
[0, 5, 4, -1, 8]
[0, 0, -1, -6, 3]
[0, 0, 0, -5, 4]
[0, 0, 0, 0, 9]
---------
连续子数组的最大和为:11,这是从第1个元素到第5个元素的和

1.2.3 方法3

def fun(inputs): #计算整数数组inputs的连续子数组的最大和
n=len(inputs)
if n==0:
return -999 #空数组则返回-999
min_num=min(inputs)
if min_num >=0:
return sum(inputs) #若数组inputs中的最小值为非负数,则连续子数组的最大和就是自身的求和
else:
max=sum(inputs) #若数组inputs中的最小值为负数,则先假设inputs自身求和是最大的
index=inputs.index(min_num) #找到min_num的索引下标
left=fun(inputs[:index]) #将inputs分成左右两个数组,并对其递归调用fun()得到左右两个数组的连续子数组的最大和left和right
right=fun(inputs[index+1:]) #左右两个数组不能包含min_num,因为它是负数,会降低最大和
if left>max: #此行到fun函数最后一行找出left、right和max的最大值并且返回
max=left
if right>max:
return right
else:
return max

if __name__=='__main__':
inputs = [] # 存储输入的整数
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while (temp != 'q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数组长度为' + str(len(inputs)) + ',如下:')
print(inputs)
print('连续子数组的最大和为:'+str(fun(inputs))) #若输出-999,代表您未输入数据

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:-2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:-3
请输入数据,若输入完毕,请输入'q'
:4
请输入数据,若输入完毕,请输入'q'
:-1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:-5
请输入数据,若输入完毕,请输入'q'
:4
请输入数据,若输入完毕,请输入'q'
:q
您输入的数组长度为9,如下:
[-2, 1, -3, 4, -1, 2, 1, -5, 4]
连续子数组的最大和为:6

2 问题2

2.1 问题描述

实现pow(x,n),即计算x的n次幂。
例如:
输入:2.00000,2
输出:4.00000

2.2 程序代码

2.2.1 方法1

def my_pow(x,n):
value=1
if n==0:
return value
for i in range(1,n+1):
value=x*value
return value
if __name__=='__main__':
x=float(input('请输入一个实数:'))
n=int(input('请输入一个正整数:'))
print(my_pow(x,n))

下面是一个输入输出示例:

请输入一个实数:-2.5
请输入一个正整数:3
-15.625

2.2.2 方法2

from numpy import floor, ceil #向下取整与向上取整

def my_pow(x, n):
lists = [999 for i in range(n+1)] #辅助数组,初始值为999
if lists[n] != 999: #若有改动则代表之前已计算出值,直接返回lists[n]
return lists[n]
if n == 1:
lists[n] = x #基本情况
else:
lists[n] = my_pow(x, int(floor(n/2))) * my_pow(x, int(ceil(n/2))) #递归
return lists[n]

if __name__ == '__main__':
x = float(input('请输入一个实数:'))
n = int(input('请输入一个正整数:'))
print(my_pow(x, n))

下面是一个输入输出示例:

请输入一个实数:4
请输入一个正整数:5
1024.0

3 问题3

3.1 问题描述

给定一个大小为n的数组,找出其中出现次数最多的数,输出该数。
例如:
输入:[2,1,2,2,1,3,2,1,2,3]
输出:2

3.2 程序代码

3.2.1 方法1

未使用递归的C++代码如下:

inputs=[] # 存储输入的整数
elements=[] # inputs中无重复的数字
temp_lists=[] # 临时列表
results=[] # 输出的结果
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while(temp!='q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数字如下:')
print(inputs)
for i in inputs:
if i not in elements:
elements.append(i)
for j in elements:
times=0
for i in inputs:
if i==j:
times+=1
temp_lists.append([j,times])
temp_lists=sorted(temp_lists,key=lambda x:x[1],reverse=True) # 排序
for i in temp_lists:
print(str(i[0])+'出现了'+str(i[1])+'次')
results.append(temp_lists[0][0]) # 出现次数排在第一的元素
for i in temp_lists[1:]: # 出现次数最多的元素可能不止一个,可能有多个
if i[1]==temp_lists[0][1]:
results.append(i[0])
print('出现次数最多的数如下:')
print(results)

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:q
您输入的数字如下:
[2, 1, 2, 2, 1, 3, 2, 1, 2, 3]
2出现了5次
1出现了3次
3出现了2次
出现次数最多的数如下:
[2]

3.2.2 方法2

使用了递归的C++代码如下:

def fun(array):
"""
函数的输出是一个列表,其中的每个元素均为"包含两个元素的"子列表
子列表中,第一个元素为数组array中的某个元素t,第二个元素为元素t在数组array中出现的次数
"""
results=[] #results是最终输出列表
length=len(array)
if length==0:
return results # 若array为空列表,则返回空列表
if length==1:
results.append([array[0],1])
return results # 若array只有一个元素,则该元素出现的次数为1
index=int(length/2)
arr1=array[:index] # 将数组array分为arr1与arr2
arr2=array[index:]
result1=fun(arr1) # 分别得出子数组的输出
result2=fun(arr2)
temp={} # 字典
for t in result1: # 先处理第一个数组
temp[t[0]]=t[1] # 键为数组中的元素,值为该元素在数组中出现的次数
for i in result2: # 处理第二个数组
if i[0] in temp.keys(): # 若第二个数组中的元素出现在字典中,则将出现次数合并
temp[i[0]]=i[1]+temp[i[0]]
else: # 若第二个数组中的元素未出现在字典中,则新建一个键值对
temp[i[0]]=i[1]
for i in temp.keys(): # 将字典转换为最终输出
results.append([i,temp[i]])
return results

if __name__=='__main__':
inputs=[] # 存储输入的整数
results=[] # 输出的结果
elements=[] # 因为出现次数最多的数可能不唯一,因此构建一个列表用于存储出现次数最多的数集
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while(temp!='q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数组长度为'+str(len(inputs))+',如下:')
print(inputs)
results=fun(inputs)
results=sorted(results,key=lambda x:x[1],reverse=True)
for i in results:
print(str(i[0])+'出现了'+str(i[1])+'次')
elements.append(results[0][0]) # 出现次数排在第一的元素
for i in results[1:]: # 出现次数最多的元素可能不止一个,可能有多个
if i[1]==results[0][1]:
elements.append(i[0])
print('出现次数最多的数如下:')
print(elements)

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:q
您输入的数组长度为10,如下:
[2, 1, 2, 2, 1, 3, 2, 1, 2, 3]
2出现了5次
1出现了3次
3出现了2次
出现次数最多的数如下:
[2]

3.2.3 方法3

def func(inputs):
new_array=[0 for i in range(max(inputs)+1)]
for i in inputs:
new_array[i]+=1
m=max(new_array)
for i in range(len(new_array)):
if new_array[i]==m:
print(i)

if __name__=='__main__':
inputs=[] # 存储输入的整数
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while(temp!='q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数组长度为'+str(len(inputs))+',如下:')
print(inputs)
print('其中出现次数最多的数如下:')
func(inputs)

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:5
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:5
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:5
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:7
请输入数据,若输入完毕,请输入'q'
:q
您输入的数组长度为9,如下:
[3, 5, 3, 2, 5, 3, 5, 1, 7]
其中出现次数最多的数如下:
3
5

3.2.4 方法4

def fun(array):
array_nums=set(array) #array_nums存储不重复的数字
num=-999 #初始化出现次数最多的数为-999
times=0 #初始化出现次数为0
for element in array_nums:
count=array.count(element)
if times<count:
times=count
num=element
for i in range(count):
array.remove(element) #移除element共count次
if times>=len(array): #若array剩余的元素个数少于times,直接返回当前出现次数最多的元素num
return num

if __name__=='__main__':
inputs=[] # 存储输入的整数
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
while(temp!='q'):
inputs.append(temp)
temp = input("请输入数据,若输入完毕,请输入'q'\n:")
inputs = [int(i) for i in inputs]
print('您输入的数组长度为'+str(len(inputs))+',如下:')
print(inputs)
print('其中出现次数最多的数如下:')
print(fun(inputs))

下面是一个输入输出示例:

请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:1
请输入数据,若输入完毕,请输入'q'
:2
请输入数据,若输入完毕,请输入'q'
:3
请输入数据,若输入完毕,请输入'q'
:q
您输入的数组长度为10,如下:
[2, 1, 2, 2, 1, 3, 2, 1, 2, 3]
其中出现次数最多的数如下:
2

END


举报

相关推荐

0 条评论