首页 > 解决方案 > 如果输入已经排序,如何避免在对二次方程的输出进行排序的问题中出现索引错误?

问题描述

所以我在 g4g 上尝试了这个问题: https ://practice.geeksforgeeks.org/problems/sort-the-given-array-after-applying-the-given-equation0304/1#

在这里,我使用这个想法来获得二次方程的最小值/最大值,以便我可以应用合并过程(它使用两个排序数组来生成一个包含两个元素的排序数组)这里 A0 和 A<=0 是用于获取抛物线的性质,向上或向下开口

我在 out.append(A*arr[i] arr[i]+B arr[i]+C) as indexerror, list out of range 处遇到错误。我确定如果 x = 0 或 x = len(nums),那么我会遇到麻烦,但我无法想到其他任何事情:

一些测试用例是:

  1. A = 1, B = 1, C = 1。N = 3 Arr[] = {1, 2, 3}

  2. A = -1,B = 2,C = -1。N = 6 Arr[] = {-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

提前致谢!

标签: python

解决方案


始终尝试将此类问题分解为小问题,以便您更轻松地了解正在发生的事情并发现错误。此外,当您可以使用简单的函数时,您不需要为这个问题定义一个类。

我不想给出一个完成的代码示例,因为我猜你喜欢自己解决问题,所以这里有一个样板可以帮助你解决它。这两个函数的主体不应该超过 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)

小剧透:用pythonN没那么重要。


推荐阅读