2011-03-15 77 views
2

我有一個叫做$ A的數組,它只包含非零的正數。PHP數組問題

現在我需要找到任意數量的具有給定總和的不同連續子數組。

我將與例如

$A = array(1,2,3,4,5); 

,我期待的總和解釋是5

然後有(2, 3)(5)

我試過搜索並得到了一個python代碼。我把它翻譯給PHP之下,但它拒絕工作

$s = 0; 
for($i = 0; $i < count($A); $i++){ 
    for($j=$i; $j < count($A); $j++){ 
     $s = $s + $A[$j]; 
     if($s == $sum) { 
      echo "[" . $i . " " . $j . "]"; 
     } 
    } 
} 

請幫助。

+6

家庭作業? :))) – 2011-03-15 12:33:04

+1

什麼是$ B?何時'$ j jensgram 2011-03-15 12:33:23

+0

另外,你爲什麼不張貼Python代碼? – jensgram 2011-03-15 12:33:43

回答

1

這將工作:

$A = array(1, 2, 3, 4, 5); 
$size = count($A); 
$sum = 5; 
$solution = array(); 
for($i = 0; $i < $size; $i++) { 
    $tempsum = 0; 
    for($j=$i; $j < $size && $tempsum < $sum; $j++) { 
     $tempsum += $A[$j]; 
     if($tempsum === $sum) { 
      $solution[] = array_slice($A, $i, $j - $i + 1); 
     } 
    } 
} 

var_dump($solution); 

至於你的代碼中,有一個在它的幾個錯誤:

  1. 您必須重新初始化$ S在每次循環。
  2. 數組$ B可能不存在(第二個循環停止條件)。
  3. 當子陣列的長度大於2時,它不會顯示正確的結果。
  4. 不需要第二個循環結束,只要臨時總和大於搜索結果,我們可以停下來。
+0

非常感謝。 – Chen 2011-03-15 13:31:32

1

您需要在內循環開始時初始化$s0

for($i = 0; $i < count($A); $i++){ 
    $s = 0; // CHANGE HERE. 
    for($j=$i; $j < count($A); $j++){ 
     $s = $s + $A[$j]; 
     if($s == $sum) { 
      echo "[" . $i . " " . $j . "]"; 
     } 
    } 
} 
+0

這應該是一個評論。 – RobertPitt 2011-03-15 12:40:57

2
  • count($A),你有沒有$B
  • $s = 0;第一循環中
  • 不要忘記,$i$j的指標,他們開始在0
  • 不要忘了給一個值$sum開始搜索之前
  • if($s > $sum)您可能想要從continue;秒OND環

祝你好運,
阿林

+1

對於好的指針而不是無證的解決方案+1。 – Nacho 2011-03-15 12:50:13

1
$a = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); // the array to search in 
$b = array(); // the resulting array 
$sum = 9; // the sum to search for 

$w = $a; // $w is the working array which we may modify 
$n = count($w); // number of elements in source array 
for($i = 0; $i < $n; $i++){ 
    $x = 0; 
    $t = array(); 
    if($w[$i] == $sum){ 
     $b[] = array($w[$i]); 
    } 
    if($w[$i] >= $sum){ 
     break; 
    } 
    for($j = $i; $j < $n; $j++){ 
     $x += $w[$j]; 
     $t[] = $w[$j]; 
     if($x == $sum){ 
      $b[] = $t; 
     } 
     if($x >= $sum){ 
      break; // already found the array, continue search 
     } 
    } 
} 

$b將是:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    int(2) 
    [1]=> 
    int(3) 
    [2]=> 
    int(4) 
    } 
    [1]=> 
    array(2) { 
    [0]=> 
    int(4) 
    [1]=> 
    int(5) 
    } 
    [2]=> 
    array(1) { 
    [0]=> 
    int(9) 
    } 
} 
+0

當您搜索子數組時,您可以立即停止$ x> $ sum。排序在我看來是錯誤的,因爲我們正在尋找數組的連續子數組,排序可能會改變序列。 – krtek 2011-03-15 13:05:26

+0

好吧,我在'($ x == $ sum)'時停止了搜索。 – mauris 2011-03-15 13:31:32

+0

是的,但是這還不夠,'$ x'可以「跳過」'$ sum',然後你將完成整個循環,因爲$ x已經大於$ sum。 – krtek 2011-03-15 13:37:06

1

這會工作

<?php 
    $a = array(1,2,3,4,5); 

    $l = sizeof($a); 

    for($i=0; $i<$l; $i++) 
    { 
     for($j=$i+1; $j<$l; $j++) 
     { 
      if($a[$i]+$a[$j] == 5) 
       echo "(".$a[$i]." , ".$a[$j].") <br/>"; 
     } 
     if($a[$i]==5) 
      echo "(".$a[$i].")<br/>"; 
    } 
    ?> 
+0

在很多情況下,這會給出錯誤的結果。它不會返回長於2個元素的子數組。它會返回[1,4],這不是連續的。而且您可以輕鬆避免完全冗餘的循環的最後部分。 – krtek 2011-03-15 13:09:11