用于查找子阵列的Sum的输出未按预期进行

时间:2015-12-25 06:17:15

标签: java arrays string

  Prateek希望在他的生日那天为他的N个朋友举办派对,每个朋友的编号从1到N.他的朋友们要求送礼来参加聚会,而不是给他一个。礼物的费用在数组中给出值,其中ith朋友要求礼物,费用为Costi。

     

但是,Prateek只有X金额花在礼物上,他想邀请他的朋友们在连续的范围内,这样朋友的礼物费用总和将完全等于X.

     

如果他可以邀请能够满足上述条件的朋友,则打印YES,否则打印NO。

  Input:
  

第一行包含一个整数T,表示测试用例的数量。在每个测试用例中,将出现以下输入: - 下一行包含两个以空格分隔的整数N和X,其中N表示朋友的数量,X表示Prateek可以在礼物上花费的金额。    - 下一行N行包含N个整数,其中第i行包含第i个整数,表示Costi。

Ouput

准确输出T行,每行包含相应测试用例的答案。

Constraints:
1 <= T <= 10
1 <= N , Costi <= 106
1 <= X <= 1012

Sample Input(Plaintext Link)
 1
 5 12
 1
 3
 4
 5
 2

Sample Output(Plaintext Link)

YES

MyApproach

我按照所说的接受输入并为每个元素取得了subarry sum。但我没有得到预期的输出。

public static void counCondition()
{   
    boolean b1=false;
    int Sum=0;
    Scanner sc=new Scanner(System.in);
    int T=sc.nextInt();
   for(int i=1;i<=T;i++)
  {
            sc.nextLine();
     String nextLine = sc.nextLine();          //@Edited my mistake 
      String[] input = nextLine.split("\\s+");
      int p = Integer.parseInt(input[0]);
      int c = Integer.parseInt(input[1]);
    int Cost[]=new int[p];
    for(int j=0;j<Cost.length;j++)
    {
       Cost[j]=sc.nextInt();
    }
    for(int k=0;k<Cost.length;k++)
    {
         Sum=0;
        for(int l=k;l<p;l++)
       {
           Sum=Sum+Cost[l];
            if(Sum>c)
            {
                break;
            }
            else if(Sum==c)
                   {
                       b1=true;
                       break;
                   }
       }
    }

     if(b1==true)
     {
         System.out.println("YES");

     }
     else
     {
         System.out.println("NO");
     }
  } 
  sc.close();
 } 

// @编辑输出仍然相同。

 **ActualInput**            **ExpectedInput**

 1                          1
 5 12                       5 12
 1                          1
 3                          3
 4                          4
 5                          5
 2                          2
 6
 7
 8 
 9
 2                          

 **ActualOutput**           Expected Output(Plaintext Link)

   NO                    YES

我不期待这个输出。

  

任何人都可以指导我为什么吗?

3 个答案:

答案 0 :(得分:1)

  

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1   在app.HackerEarth25Dec2015.counCondition(HackerEarth25Dec2015.java:18)

发生异常是因为您调用next()方法而不是nextLine()next()方法返回下一个5此处不是完整行的标记。

此外,我建议您使用扫描仪中的nextInt(),而不是获取字符串并拆分和解析它。这将是一种更清洁的做事方式。

  int p = sc.nextInt();
  int c = sc.nextInt();
  

你的逻辑也不正确。我希望你能找到逻辑错误并修复它。

您可以使用以下代码解决问题。

sc.nextLine(); // This is to read the `\n` left from previous `nextInt()`
String nextLine = sc.nextLine();
String[] input = nextLine.split("\\s+");

答案 1 :(得分:1)

在Cost数组中获得个人成本后。 这是使连续和等于最大总和的逻辑。

保持一个起始索引变量,告诉连续序列的起始位置。在开始时它应该是零索引。

维护sum变量以跟踪总和。

运行for循环,从零到endIndex。

如果总和小于最大金额

将费用[i]添加到总和。

否则如果sum等于max sum,则打破for循环

否则,如果总和大于最大值

现在从startIndex中删除元素,直到sum再次使用while循环变得小于或等于max sum。

while(sum&gt; maxSum)

sum = sum - cost [startIndex]

增加startIndex

while循环完成

如果sum等于maxsum,打破你得到答案的循环

否则继续外部for循环。

这种逻辑的想法是,每当总和增加最大值时,一直从总和中删除元素。

答案 2 :(得分:1)

Scanner sc=new Scanner(System.in);
  int t=sc.nextInt();
  while(t>0)
  {
   int n=sc.nextInt();
   long x=sc.nextLong();
   long[] money=new long[n];
   for(int i=0;i<n;i++)
   {
    money[i]=sc.nextInt();
   }
   long sum;
   int c=0;
   sum=money[0];
   for(int i=1;i<n;i++)
   {
    if(sum<x)
     sum=sum+money[i];
    else if(sum==x)
     break;
    while(sum>x)
    {
     sum=sum-money[c];
     c++;
    }
   }
   if(sum==x)
    System.out.println("YES");
   else
    System.out.println("NO");
   t--;
  }

此处http://jayarampandava.blogspot.in/2015_10_01_archive.html 你可以找到实际的解决方案