2015-09-27 58 views
0

我试图解决最大距离和这是一个代码的eval挑战这是这样的:最大范围和编码评估和演示挑战

鲍勃正在制定新的战略,以获得丰富的股市。他希望将自己的投资组合投资1天或更长时间,然后在合适的时间出售以最大限度地提高收益。鲍勃苦心追踪了他的投资组合在过去N天里每增加或减少多少。现在他已经雇佣你去弄清楚他的投资组合能够取得的最大收益。

例如:

鲍勃跟踪股票市场的最后10天。上的每一天中,增益/损失如下:

7 -3 -10 4 2 8 -2 4 -5 -2

如果Bob进入第4天股市和退出在第8天( 5天计),他的收益将一直

16(4 + 2 + 8 + 2 + 4)

我的输入文件包括:

5;7 -3 -10 4 2 8 -2 4 -5 -2 
6;-4 3 -10 5 3 -7 -3 7 -6 3 
3;-7 0 -45 34 -24 7 

我索姆ehow得到这三条线的输出为零。 我试过调试,但没有得到该问题。 这里是我的代码:

package MaxRangeSum; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import static java.lang.Math.floor; 
import java.util.StringTokenizer; 

/** 
* 
* @author kanua_000 
*/ 
public class MaxRangeSum { 

    public static int ret_cross = 0,ret_sum = 0; 
    public static Integer leftsum = Integer.MIN_VALUE; 
    public static Integer rightsum = Integer.MIN_VALUE; 
    public static int sum_cross = 0, maxleft = 0,sum_max = 0; 
    public static int leftsum_subarray = 0; 
    public static int rightsum_subarray = 0; 
    public static int crosssum = 0; 


    public static int max_crossing_subarray(int[] A, int low, int mid, int high) { 


     int i = mid; 
     while (i != low) { 
      sum_cross = sum_cross + A[i]; 
      if (sum_cross > leftsum) { 
       leftsum = sum_cross; 
       // maxleft = i; 
      } 
      --i; 
     } 


     // int maxright = 0; 
     sum_cross = 0; 
     int j = mid + 1; 

     while (j != high) { 
      sum_cross = sum_cross + A[j]; 
      if (sum_cross > rightsum) { 
       rightsum = sum_cross; 
      // maxright = j; 
      } 
      ++j; 
     } 

     ret_cross = leftsum + rightsum; 

     return (ret_cross); 

    } 

    public static int max_subarray(int[] a, int low, int high) { 

     int i = 0,j = 0; 
     int[] A = new int[50]; 

     if (low == high) { 
      return (A[low]); 
     } else { 

      int mid = (int) (floor((low + high)/2)); 

      while (i != mid) { 
       ret_sum = ret_sum + A[i]; 
       if (ret_sum > leftsum_subarray) { 
        leftsum_subarray = ret_sum; 
       } 
       i++; 
      } 

      leftsum_subarray = max_subarray(A, low, mid); 

      j = mid+1; 

      while (j != high) { 
       ret_sum = ret_sum + A[j]; 
       if (ret_sum > rightsum_subarray) { 
        rightsum_subarray = ret_sum; 
        // maxleft = i; 
       } 
       j++; 
      } 

      rightsum_subarray = max_subarray(A, (mid + 1), high); 



      crosssum = max_crossing_subarray(A, low, mid, high); 

      if ((leftsum_subarray >= rightsum_subarray) & (leftsum_subarray >= crosssum)) { 
       return (leftsum_subarray); 
      } else if ((rightsum_subarray >= leftsum_subarray) & (rightsum_subarray >= crosssum)) { 
       return (rightsum_subarray); 
      } else { 
       return (crosssum); 
      } 
     } 

    } 

    public static void main(String args[]) throws FileNotFoundException, IOException { 

     int n = 0, i = 0; 

     int line1[] = new int[50]; 
     int line2[] = new int[10]; 
     int line3[] = new int[10]; 
     int line4[] = new int[6]; 

     try (BufferedReader in = new BufferedReader(new FileReader("E:\\FresnoState\\CSCI 174\\MaxRangeSum.txt"))) { 

      String line; 
      while ((line = in.readLine()) != null) { 
       StringTokenizer tokenizer = new StringTokenizer(line, " "); 

       while (tokenizer.hasMoreTokens()) { 

        String digits = tokenizer.nextToken(); 

        if (digits.contains(";")) { 
         digits = (digits.substring(2)); 
        } 

        line1[i] = Integer.parseInt(digits); 

        i++; 
       } 
      } 

     } 

     int numOfChunks = 10; 

     for (int k = 0; k < numOfChunks; k++) { 
      line2[k] = line1[k]; 
     } 

     for (int r = 0; r < line2.length; ++r) { 
      System.out.print(line2[r] + " "); 
     } 

     System.out.println(); 

     numOfChunks = 9; 
     int j = 10; 

     for (int l = 0; l <= numOfChunks; ++l, ++j) { 
      line3[l] = line1[j]; 
     } 

     for (int r = 0; r < line3.length; ++r) { 
      System.out.print(line3[r] + " "); 
     } 

     System.out.println(); 

     numOfChunks = 6; 
     j = 20; 
     for (int m = 0; m < numOfChunks; ++m, ++j) { 
      line4[m] = line1[j]; 
     } 

     for (int r = 0; r < line4.length; ++r) { 
      System.out.print(line4[r] + " "); 
     } 

     System.out.println(); 

     int line1_maxsum = max_subarray(line2, 1, 10); 
     int line2_maxsum = max_subarray(line3, 11, 20); 
     int line3_maxsum = max_subarray(line4, 21, 26); 

     System.out.println(line1_maxsum); 
     System.out.println(line2_maxsum); 
     System.out.println(line3_maxsum); 

    } 

} 
+1

你是怎么“*试着调试*”的?你是否一步一步地通过你的代码? –

+1

我建议阅读[Kadane算法](https://en.wikipedia.org/wiki/Maximum_subarray_problem)。 – Emz

+0

是的,我一步一步来,我的断点是循环,返回语句和函数调用。 –

回答

0

我不知道是什么,因为它的这些乱七八糟的方法max_subarray是干什么的,但如果你想在行加起来的数量尝试在max_subarray方法使用该我猜你可以解决它。

public static int max_subarray(int[] a, int low, int high) { 

    int theMiddle = (int) Math.floor(a.length/2); 
    int leftSum = addArray(a, 0, theMiddle); 
    int rightSum = addArray(a, theMiddle, a.length); 

    if(leftSum > rightSum){ 
     return leftSum; 
    }else{ 
     return rightSum; 
    } 

} 

public static int addArray(int[] a, int start, int end) { 
    int sum = 0; 
    for (int i = start; i < end; i++) { 
     sum = sum + a[i]; 
    } 

    return sum; 
} 
+0

在max_subarray中,我将数组分为3部分 - 左,右和中部。然后我迭代左边的子数组以找到最大值,对于右侧子数组和中间子数组也是如此。中间的子数组在我的代码中用十字表示。在从左,右和中间子数组中获得总和的最大值后,我正在检查哪一个最大,然后返回。 –

+0

所以这个输入5; 7 -3 -10 4 2 8 -2 4 -5 -2 6; -4 3 -10 5 3 -7 -3 7 -6 3 3; -7 0 -45 34 - 每行24 7分为3部分或每行都是一部分?如果你将每行分成3部分,每部分有多大,因为它的10个数字,它不会均匀分成3部分 –

+0

我将每行分为3部分。部分不相等,对于其中有10个整数的第一个输入行,左侧子数组有5个元素,右侧有5个。然后中间子数组具有一些重叠值,并且该数组的上部和下部索引在maximum_cross_subarray函数中进行调整。在这个函数中,max子数组是根据数组中的中间元素来决定的。 –