如果输入数组中的任何两个值等于目标和,我该如何在PHP中编写一个函数,该函数接受一个数组并返回一个数组


function twoNumberSum($array,$targetSum) {
sort($array);
$left = 0;
$right = count($array) - 1;
while ($left < $right) {
$currentSum = $array[$left] + $array[$right];
if($currentSum == $targetSum) {
print_r([$array[$left], $array[$right]]);
} else if ($currentSum < $targetSum) {
$left += 1;
} else if ($currentSum > $targetSum) {
$right -= 1;
}
}
return [];
}

$numArray = [3,5,-4,8,11,1,-1,6];
$targetSum = 10;
twoNumberSum($numArray,$targetSum);

目标

我的目标是使用指针在两端缓慢地处理数组,同时添加array[left]和array[right]处的值。如果currentSum小于targetSum,则左指针向上移动一。如果currentSum大于targetSum,则右指针向下移动一。如果currentSum和targetSum相等,则函数返回array[left]和array[right]的数组。

问题

出于某种原因,当我使用上面的数组和目标值运行代码时,预期输出为(11,-1(,我得到了预期的输出,但它重复了好几次。实际上,我并不鼓励大家在自己的机器上运行这些代码。我会附上一张我所看到的截图。以上代码的输出

我尝试过的

我已经尝试使用下面的return关键字退出函数,我正在调用print_r函数。这是有效的,但只是在一定程度上。如果targetValue等于4,在这种情况下,预期输出为(3,1((5,-1(和(-4,8(,则输出仅返回最后一对有效整数,而不是所有整数。

如果能为我们解决这个问题提供任何帮助,我们将不胜感激。

循环遍历数组,对于每个元素,循环遍历数组的其余部分以测试和。

function twoNumberSum ( $inputArray, $targetSum ) {
for ( $i = 0; $i < count( $inputArray ) - 1; $i++ ) {
for ( $e = $i + 1; $e < count( $inputArray ); $e++ ) {
if ( $inputArray[$i] + $inputArray[$e] == $targetSum ) return [];
}
}
return null;
}
$numArray = [3,5,-4,8,11,1,-1,6];
$targetSum = 10;
var_dump( twoNumberSum( $numArray, $targetSum ) );

要将数组的所有元素相互比较,需要2个循环。此解决方案使用2个forech循环,并返回满足条件的所有可能的对。不需要手动创建$inputArray的副本,因为PHP forech在内部使用副本。

function twoNumberSum ( $inputArray, $targetSum ) {
$res = [];
foreach($inputArray as $i => $firstVal){
array_shift($inputArray);
foreach($inputArray as $secVal){
if ( $firstVal + $secVal == $targetSum ) {
$res[] = [$firstVal,$secVal] ;
}
}
}
return $res;
}
$numArray = [3,5,-4,8,11,1,-1,6];
$targetSum = 4;
var_export( twoNumberSum( $numArray, $targetSum ) );

输出:

array (
0 => 
array (
0 => 3,
1 => 1,
),
1 => 
array (
0 => 5,
1 => -1,
),
2 => 
array (
0 => -4,
1 => 8,
),
)

尝试自我。

最新更新