J'ai fait des problèmes sur HackerRank pour mettre le pied dans la porte pour résoudre des problèmes de Python et même si je me suis amusé à en travailler sur quelques-uns, un problème me surprend.
Ce problème est le Mini-Max sum, qui prend une entrée ( arr ); un tableau de 5 entiers , et imprime la somme des 4 entiers les plus grands et les plus petits de arr dans le format de la ligne suivante via miniMaxSum(arr)
maximum minimum
par exemple miniMaxSum (1, 2, 3, 4, 5)
10 14
J'ai fait quelque chose que vous pouvez trouver ci-dessous qui fonctionne avec ceci, et la plupart des exemples pour renvoyer les résultats souhaités, mais je viens de découvrir que cela ne fonctionne pas pour arr = (5, 5, 5, 5, 5). Je soupçonne que c'est parce que lorsque la valeur maximale est identique à une autre valeur de la liste (par exemple arr = 1, 2, 3, 4, 4) ou de même pour le minimum (par exemple arr = 1, 1, 3, 4, 5) , mon code échoue tout simplement car il repose sur le fait que rien ne correspond à la valeur la plus grande ou la plus petite de arr . Le message d'erreur HackerRank est " Mauvaise réponse " si cela vous aide.
Veuillez critiquer et suggérer des améliorations pour que cela fonctionne avec tout strong > tableau de 5 entiers (par exemple (5, 5, 5, 5, 5)). Je tiens à comprendre comment cela fonctionne et votre aide serait extrêmement appréciée. Merci d'avance!
# Complete the miniMaxSum function below.
def miniMaxSum(arr):
listmax = []
listmin = []
for number in arr:
if number > min(arr):
listmax.append(number)
for number in arr:
if number < max(arr):
listmin.append(number)
maxnum = sum(listmax)
minnum = sum(listmin)
print (minnum, maxnum)
8 Réponses :
Comme c'est une très petite liste, je la trierais simplement, puis je choisirais les 5 premiers, puis les 5 derniers et je prendrais la somme de ceux-ci, respectivement.
>>> print(miniMaxSum([1,2,3,4,5])) (10, 14) >>> print(miniMaxSum([5,5,5,5,5])) (20, 20)
Résultat:
def miniMaxSum(arr): arr_sorted = sorted(arr) return sum(arr_sorted[:4]), sum(arr_sorted[-4:]) print(miniMaxSum([1,2,3,4,5])) print(miniMaxSum([5,5,5,5,5]))
Merci @ booleys1012! Cette méthode fonctionne parfaitement :)
Essayez de prendre la somme globale et de soustraire le minimum ou le maximum:
def maxnum (x):
return sum(x) - min(x)
def minnum(x):
return sum(x) - max(x)
a = list(range(5))
b = [5]*5
print (a)
print (maxnum(a), minnum(a))
print (b)
print (maxnum(b), minnum(b))
résultat:
[0, 1, 2, 3, 4]
10 6
[5, 5, 5, 5, 5]
20 20
J'aime l'idée de Ruslan de trouver la somme puis de soustraire le min ou le max pour obtenir chaque réponse. Cependant, au lieu d'utiliser 3 boucles (une pour somme, une pour min et une pour max), nous pouvons tout faire en une seule boucle -
from math import inf
def minimum (a, b):
return a if a < b else b
def maximum (a, b):
return a if a > b else b
def minmaxsum (*xs):
min = inf
max = -inf
sum = 0
for x in xs:
min = minimum (min, x)
max = maximum (max, x)
sum = sum + x
return (sum - max, sum - min)
print (minmaxsum (1, 3, 5, 7, 9))
# (16, 24)
print (minmaxsum (1, 2, 3, 4, 5))
# (10, 14)
def miniMaxSum(a):
max = sum(list(filter(lambda x: x<max(a) if a.count(max(a))==1 else x<=max(a),a)))
min = sum(list(filter(lambda x: x>min(a) if a.count(min(a))==1 else x>=min(a),a)))
print(min,max)
This may help, and if not, can you update your expected output when your input is [1,1,2,3,4] or [1,2,3,4,4] or [5,5,5,5,5] ?
#!/bin/python3 # Complete the miniMaxSum function below. def miniMaxSum(arr): arr=sorted(arr) s = sum(arr) print(s-arr[-1],s-arr[0])
arr [len (arr) -1] == arr [-1]
Je pense que cette solution sera pratique pour tous les cas de test du problème. alors, essayez-le et exécutez.
def miniMaxSum(arr):
max_elem = max(arr)
min_elem = min(arr)
mini = arr.copy()
mini.remove(max_elem)
maxi = arr.copy()
maxi.remove(min_elem)
sum_min = sum(mini)
sum_max = sum(maxi)
print(sum_min, sum_max)
if __name__ == '__main__':
arr = list(map(int, input().rstrip().split()))
miniMaxSum(arr)
Cela ne fonctionne pas avec les tableaux de cas de bord, disons [5,5,5,5,5] parce que lorsque le programme essaie de choisir les 'listmax' et 'listmin', le programme se trouve dans une position unique «nombre» n'est ni supérieur ni inférieur au maximum (arr). vous pouvez essayer d'ajouter une condition lorsque chaque index est comparé au max afin de ne pas manquer les répétitions de valeurs max / min.
Je suis allé pour calculer toutes les sommes et ensuite choisir le min et le max. J'espère que vous trouverez le code ci-dessous utile:
def miniMaxSum(arr):
sum_all = [] #list of sums of all the 4 elements
temp = arr
for i in range(5):
p = temp.pop(i) #popping out an element to get an array of 4 elements
sum_all.append(sum(temp)) #calculating sum of all 4 elements
temp.insert(i,p) #reset the list
s_max = max(sum_all)
s_min = min(sum_all)
print(s_min , s_max) #prints the min and max of all the sums
pure logique -
Test case 0 Test case 1 Test case 2 Test case 3 Test case 4 Test case 5 Test case 6 Test case 7 Test case 8 Test case 9 Test case 10 Test case 11 Test case 12 Test case 13 Test case 14 Compiler Message Success Input (stdin) 1 2 3 4 5 Expected Output 10 14
Je n'utilise pas de mot-clé comme short, sum. Tous les cas de test sont terminés, Réponse-
def miniMaxSum(arr):
sums=[]
s=0
for i in range(len(arr)):
for j in range(len(arr)):
s += arr[j] # suming all
s = s-arr[i]
# remove current position value because u need sum of (size-1)
sums.append(s)
s=0
low=high=sums[1] #assign first value for comparison
for i in range(len(sums)):
if low > sums[i]:
low = sums[i]
if high < sums[i]:
high =sums[i]
print(low,high)
Oubliez-vous de mentionner que l’objectif est d’ajouter 4 sur les 5 nombres? référence ?
Une solution simple pourrait être de commencer par
trierl'entrée. Leminsera la somme des quatre premiers nombres, lemaxsera la somme des quatre derniers nombres.Si le code fonctionne, il appartient probablement à codereview.stackexchange.com
Salut @ user633183, vous avez raison, et j'ai édité la question pour dire que la somme affichée est des 4 nombres les plus grands et les plus bas. Et merci beaucoup pour la solution! Ça a marché :)
Salut @Alexander, mes excuses; Je viens de faire mon compte aujourd'hui, donc j'ai supposé que c'était l'endroit pour le mettre. Vous pouvez y déplacer cette question si elle correspond le mieux au site Web