Как я могу избежать ошибки индекса в вопросе о сортировке выходных данных из квадратного уравнения, если входные данные уже отсортированы?

#python

Вопрос:

Поэтому я попробовал этот вопрос на g4g: https://practice.geeksforgeeks.org/problems/sort-the-given-array-after-applying-the-given-equation0304/1#

Здесь я использую идею, чтобы получить минимумы/максимумы квадратного уравнения, чтобы я мог применить процесс слияния(который использует два отсортированных массива для создания одного отсортированного массива, содержащего оба элемента). Здесь A0 и A

Я сталкиваюсь с ошибкой в out.добавить(A*arr[i]arr[i] B arr[i] C) в качестве ошибки индекса, список вне диапазона. Я уверен, что если x = 0 или x = len(nums), то у меня будут проблемы, но я не могу думать иначе:

Некоторые из тестовых примеров являются:

  1. A = 1, B = 1, C = 1. N = 3 Об.[] = {1, 2, 3}
  2. A = -1, B = 2, C = -1. N = 6 Об.[] = {-1, 0, 1, 2, 3, 4}

Вот мой код для того же:

      class Solution:
            def sortArray(self, arr, n, A, B, C):
                # Code here
                #nums = arr[:]
                #print(nums)
                out = []
                nums = []
                for i in range(len(arr)):
                    nums.append(A*arr[i]*arr[i] B*arr[i] C)
                    
                x = -((B)//2*A) 
        
                #print(x)
                i = x
                j = x-1
                #out = []
                if i == 0:
                    return arr
                
                if A>0:
                    while j>=0 and i<len(nums):
                        if A*arr[i]*arr[i] B*arr[i] C<=A*arr[j]*arr[j] B*arr[j] C:
                            out.append(A*arr[i]*arr[i] B*arr[i] C)
                            i =1
                        else:
                            out.append(A*arr[j]*arr[j] B*arr[j] C)
                            j-=1
                    
                    
                    while i<len(nums):
                        
                        #print(i)
                        out.append(A*arr[i]*arr[i] B*arr[i] C)
                        i =1
                    while j>=0:
                        out.append(A*arr[j]*arr[j] B*arr[j] C)
                        j-=1
                    return out
                    
                elif A<=0:
                    
                     
                        
                    i = 0
                    j = len(nums)-1
                    while j>=x and i<x:
                        
                        if A*arr[i]*arr[i] B*arr[i] C<=A*arr[j]*arr[j] B*arr[j] C:
                            
                            out.append(A*arr[i]*arr[i] B*arr[i] C)
                            i =1
                        else:
                            out.append(A*arr[j]*arr[j] B*arr[j] C)
                            j-=1
                    
                    while j>=x:
                        out.append(A*arr[j]*arr[j] B*arr[j] C)
                        j-=1
                    while i<x:
                        out.append(A*arr[i]*arr[i] B*arr[i] C)
                        i =1
                    return out
                 
                   
                  
                
            

#{ 
#  Driver Code Starts
#Initial Template for Python 3

    if __name__ == '__main__':
        T=int(input())
        for i in range(T):
            a, b, c = input().split()
            a = int(a)
            b = int(b)
            c = int(c)
            n = int(input())
            arr = list(map(int, input().split()))
            ob = Solution()
            ans = ob.sortArray(arr, n, a, b, c)
            for each in ans:
                print(each,end=" ")
            print()

#} Driver Code Ends
 

Заранее спасибо!

Комментарии:

1. Почему бы просто не вывести массив функций из заданных входных данных с помощью map функции, а затем отсортировать новый массив по любому алгоритму сортировки O(N). Это было бы гораздо более прямолинейно.

Ответ №1:

Всегда старайтесь разбить такую проблему на мелкие части, чтобы вам было легче понять, что происходит, и найти ошибки. Кроме того, вам не нужно определять класс для этой проблемы, когда вы можете просто использовать простые функции.

Я не хочу приводить готовый пример кода, потому что я предполагаю, что вам нравится решать проблему самостоятельно, поэтому вот шаблон, который может помочь вам ее решить. Тело двух функций не должно быть длиннее, возможно, 10 строк кода, поэтому, если у вас в итоге будет больше строк, вам следует пересмотреть свое решение. Удачи 🙂

 def calculate_new_array(arr, a, b, c):
    # calculate the resulting array out of the input values
    # ...
    # return resulting array
    return result


def sort_array(arr):
    # sort the array somehow
    # ...
    # return the sorted array
    return sorted_arr


if __name__ == '__main__':
    a, b, c = input().split()
    a = int(a)
    b = int(b)
    c = int(c)
    arr = list(map(int, input().split()))

    new_array = calculate_new_array(arr, a, b, c)
    sorted_array = sort_array(new_array)
    print(sorted_array)
 

Маленький маленький спойлер: С python N это не так важно.