题目
给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
输入描述
第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后的输入为需要计算总和的区间,直至文件结束。
输出描述
输出每个指定区间内元素的总和。
输入示例
5
1
2
3
4
5
0 1
1 3
输出示例:
3
9
方法一:暴力求解
public class QuJianHe {
// 方法一: 暴力求解
public static void main(String[] args){
// 键盘输入 数组长度
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
// 输入数组中的值
for(int i = 0; i < n; i++){
arr[i] = sc.nextInt();
}
// 读取区间并计算总和
/*scanner.hasNext():
这是 Scanner 类中的一个方法,返回一个布尔值。
它检查输入流中是否还有下一个可读取的标记(例如下一个整数、字符串等)。
如果有下一个标记,它返回 true,否则返回 false
* */
while(sc.hasNext()){
// 读取左右区间
int left = sc.nextInt();
int right = sc.nextInt();
int sum = 0;
// 计算区间和并输出
for(int i = left; i <= right; i++){
sum = sum + arr[i];
}
System.out.println(sum);
}
sc.close();
}
}
方法二:前缀和
public class QuJianHe2 {
// 方法二: 前缀和
public static void main(String[] args){
// 数组的输入 并且同时计算前缀和
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] array = new int[n];
// 通过维护一个前缀和数组 prefixSum,其中 prefixSum[i] 表示从数组起始位置到第 i-1 个元素的总和。
int[] preSum = new int[n+1];
for (int i = 0; i < n; i++) {
array[i] = sc.nextInt();
preSum[i + 1] = preSum[i] + array[i];
}
// 读取区间计算区间和
while(sc.hasNext()){
int left = sc.nextInt();
int right = sc.nextInt();
int sum = preSum[right+1] - preSum[left];
System.out.println(sum);
}
sc.close();
}
}