当执行求和序列时,所需的输出会发生变化。
问题是:
莉莉(Lily)有一条巧克力棒,她想与罗恩(Ron)一起分享他的生日。每个正方形上都有一个整数。她决定共享所选条形的连续段,以使段的长度与Ron的出生月份相匹配,并且平方上的整数之和等于他的出生日期。您必须确定她可以分割巧克力的多少种方法。
将巧克力块视为正方形数组s=2,2,1,3,2
。她想找到汇总到罗恩(Ron)生日d=4
的段,长度等于他的出生月份m=2
。在这种情况下,有两个满足她条件的细分:2,2
和3,1
。
功能描述
在下面的编辑器中完成生日功能。它应该返回一个整数,表示Lily划分巧克力棒的方式数量。
生日具有以下参数:s
:整数数组,每个巧克力方块上的数字d
:整数,罗恩的生日m
:整数,罗恩的出生月份
输入格式
第一行包含整数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
条款? 最佳答案
在算法(如下所示)中,您正在检查内部循环结束之前的总和:
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
因此,您的外部for循环应仅持续到第(n-d)个元素