如何在Java中添加一系列数字

3
当求和序列被实现时,期望的输出会发生变化。
问题是:
Lily 有一块巧克力,她想与 Ron 分享他的生日。每个方格上都有一个整数。她决定分享一段连续的巧克力,使得这段巧克力的长度等于 Ron 的出生月份,并且方格上的整数之和等于他的出生日期。你必须确定她可以分割巧克力的方法数。
将巧克力条视为方格数组,s = 2,2,1,3,2。她想找到总和为 Ron 的出生日期(d = 4)且长度等于他的出生月份(m = 2)的片段。在这种情况下,有两个满足条件的片段:2,2 和 3,1。
函数描述
完成编辑器中的 birthday 函数。它应该返回一个整数,表示 Lily 可以分割巧克力的方法数。
Birthday 具有以下参数:
s:一个整数数组,表示巧克力每个方格上的数字 d:一个整数,代表 Ron 的出生日期 m:一个整数,代表 Ron 的出生月份
输入格式
第一行包含一个整数 n,表示巧克力条中的方格数。 第二行包含 n 个空格分隔的整数 s[I],表示巧克力方格上的数字。 第三行包含两个空格分隔的整数 m 和 d,Ron 的出生日期和他的出生月份。
输出格式
打印一个整数,表示 Lily 可以分割巧克力条与 Ron 分享的总方法数。
样例输入 0
5
1 2 1 3 2
3 2

样例输出0

2

以下是我的 Java 代码

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;

import java.util.Scanner;
public class Solution {

public static void main(String args[])
{
  int a[] = new int[1000];
  Scanner s=new Scanner(System.in);
  int sum=0,count=0;
  int n=s.nextInt();
  for(int i=0;i<n;i++)
  {
    a[i]=s.nextInt();
  }
  int m=s.nextInt();
  int d=s.nextInt();
  for(int i=0;i<n;i++){ 
    for(int j=i;j<d+i;j++)
    {
      sum=sum+a[j];
      if(sum==m)
      {
        count++;

      }
    }sum=0; 
  }
  System.out.println(count);
}}

我得到的输出是3而不是2。如何对前d个数求和?

1
侧边栏:int a[] = new int[n] - Andrew S
2个回答

1
在您的算法中(如下所示),您在内部循环结束之前检查总和:
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;

import java.util.Scanner;
public class Solution {

public static void main(String args[])
{
  int a[] = new int[1000];
  Scanner s=new Scanner(System.in);
  int sum=0,count=0;
  int n=s.nextInt();
  for(int i=0;i<n;i++)
  {
    a[i]=s.nextInt();
  }
  int m=s.nextInt();
  int d=s.nextInt();
  for(int i=0;i<n;i++){ 
    for(int j=i;j<d+i;j++)
    {
      sum=sum+a[j];
      //THIS CHECK SHOULD BE OUTSIDE THE CURRENT FOR LOOP
      if(sum==m)
      {
        count++;

      }
    }sum=0; 
  }
  System.out.println(count);
}}

你应该这样做,

像这样:

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;

import java.util.Scanner;
public class Solution {

public static void main(String args[])
{
  int a[] = new int[1000];
  Scanner s=new Scanner(System.in);
  int sum=0,count=0;
  int n=s.nextInt();
  for(int i=0;i<n;i++)
  {
    a[i]=s.nextInt();
  }
  int m=s.nextInt();
  int d=s.nextInt();
  for(int i=0;i<n;i++){ 
    for(int j=i;j<d+i;j++)
    {
      sum=sum+a[j];
    }

      if(sum==m)
      {
        count++;

      }
    sum=0; 
  }
  System.out.println(count);
}}

然而,即使上述解决方案也存在一个边缘情况。你正在将名为a的数组初始化为长度为1000的数组,这会在代码中引入错误。例如,请考虑以下输入。
5
1 2 1 3 2
2 2

现在,由于您的数组a看起来像以下内容:

1 2 1 3 2 0 0 0 0 ... //till length 1000

你的算法会给出以下作为有效答案的答案。而实际上并没有任何一个答案:
1 2 1 3 [2 0] 0 0 0 ... //till length 1000

所以你的外层循环只需要执行到第 (n-d) 个元素。

加一分给你,伙计! - Shravan Kumar

0

试一下这个,

//n - amount of bars
//s - array of bars (s[i] - weight of each bar)
//d - Ron's birthday
//m - Ron's birthmonth

int answer = 0;
 // iterate bars
for (int k = 0; k < s.length; k += 1) {
     int sum = 0;
     // iterate bars month times
     for (int j = i; j < m + i; j += 1) {
         // count sum of weights month times
         sum += s[j];
     }
     // if counted sum is equal to amount of days
     // then it's +1 to possible ways!
     if (sum == d) {
        answer += 1;
     }
}

不行,这个不好使,我们需要迭代直到天数d而不是月份m。 - Shravan Kumar
哦,那种情况下,你只需要使用天数d,并对其进行迭代,我现在无法测试它,但它应该可以工作。 - Jose Anibal Rodriguez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接