0

我正在处理一个编码忍者问题,执行时只满足了 1 个测试用例,请帮忙。

给定一个随机整数数组和一个数字 x。查找并打印数组中总和为 x 的元素的三元组。

打印三元组时,首先打印最小的元素。

也就是说,如果一个有效的三元组是 (6, 5, 10) 打印“5 6 10”。没有限制必须在第一行打印 5 个三元组。您可以按任何顺序打印三元组,只需注意三元组中元素的顺序。

样本输入

7
1 2 3 4 5 6 7 
12

样本输出

1 4 7
1 5 6
2 3 7
2 4 6
3 4 5

这是我的代码

#include<iostream>
using namespace std;
void FindTriplet(int arr[], int n, int sum)
{
    for (int i = 0; i<n-2; i++)
    {
        for (int j = i+1; j < n -1; j++)
        {
            for (int k = j+1; k < n; k++)
            {
                if (arr[i] + arr[j] + arr[k] == sum)
                {   
                    if(arr[i]<arr[j] && arr[i]<arr[k])
                    {
                        if(arr[j]<arr[k])
                            cout << arr[i] << " "<< arr[j] << " " << arr[k] <<endl;
                        else
                            cout << arr[i] << " "<< arr[k] << " " << arr[j] <<endl;
                    }
                    else if(arr[j]<arr[i] && arr[j]<arr[k])
                    {
                        if(arr[i]<arr[k])
                            cout << arr[j] << " "<< arr[i] << " " << arr[k] <<endl;
                        else
                            cout << arr[j] << " "<< arr[k] << " " << arr[i] <<endl;
                    }
                    else
                    {
                        if(arr[i]<arr[j])
                            cout << arr[k] << " "<< arr[i] << " " << arr[j] <<endl;
                        else
                            cout << arr[k] << " "<< arr[j] << " " << arr[i] <<endl;
                    }   
                }
            }
        }
    }
}

int main()
{
    int size;

    int x;
    cin>>size;
    
    int *input=new int[1+size]; 
    
    for(int i=0;i<size;i++)
        cin>>input[i];
    cin>>x;

    FindTriplet(input,size,x);
        
    return 0;
}
4

2 回答 2

1

如果三元组在第 i 个和第 j 个位置由 2 个相等的数字组成,会发生什么arr[k] > arr[i]?例如(1, 1, 2)所需的总和4

表达式arr[i]<arr[j] && arr[i]<arr[k]是错误的。对于arr[j]<arr[i] && arr[j]<arr[k]. 所以你落入了else分支(arr[k]<arr[i] && arr[k]<arr[j]),这是不正确的。

于 2020-08-07T20:45:01.543 回答
0

这是一个逻辑错误。

我将 < 替换为 <= 以使代码也可以比较相等的数字。

正确的代码是 -

#include<iostream>
using namespace std;
void FindTriplet(int arr[], int n, int sum)
{
    for (int i = 0; i<n-2; i++)
    {
        for (int j = i+1; j < n -1; j++)
        {
            for (int k = j+1; k < n; k++)
            {
                if (arr[i] + arr[j] + arr[k] == sum)
                {   
                    if(arr[i]<=arr[j] && arr[i]<=arr[k])
                    {
                        if(arr[j]<=arr[k])
                            cout << arr[i] << " "<< arr[j] << " " << arr[k] <<endl;
                        else
                            cout << arr[i] << " "<< arr[k] << " " << arr[j] <<endl;
                    }
                    else if(arr[j]<=arr[i] && arr[j]<=arr[k])
                    {
                        if(arr[i]<=arr[k])
                            cout << arr[j] << " "<< arr[i] << " " << arr[k] <<endl;
                        else
                            cout << arr[j] << " "<< arr[k] << " " << arr[i] <<endl;
                    }
                    else
                    {
                        if(arr[i]<=arr[j])
                            cout << arr[k] << " "<< arr[i] << " " << arr[j] <<endl;
                        else
                            cout << arr[k] << " "<< arr[j] << " " << arr[i] <<endl;
                    }   
                }
            }
        }
    }
}

int main()
{
    int size;

    int x;
    cin>>size;
    
    int *input=new int[1+size]; 
    
    for(int i=0;i<size;i++)
        cin>>input[i];
    cin>>x;

    FindTriplet(input,size,x);
        
    return 0;
}

感谢所有帮助过我的人。

于 2020-08-07T20:47:49.050 回答