第一题
class NumArray {
int arr[];
public NumArray(int[] nums) {
int n=nums.length+1;
arr=new int[n];
for(int i=0;i<n-1;i++){
arr[i+1]=nums[i]+arr[i];
}
}
public int sumRange(int left, int right) {
return arr[right+1]-arr[left];
}
}
每次调用 sumRange 时,通过循环的方法计算数组 nums 从下标 left 到下标 right范围内的元素和,需要计算 right−left+1 个元素的和。
第二题
class Solution {
public int sumOddLengthSubarrays(int[] arr) {
int sum=0;
for(int start=0;start<arr.length;start++){
for(int length=1;start+length<=arr.length;length+=2){
int end=length+start-1;
for(int i=start;i<=end;i++){
sum+=arr[i];
}
}
}
return sum;
}
}
令数组 arr 的长度为 n,子数组的开始下标为 start,长度为 length,结束下标为 end,则有 0≤start≤end<n,length=end−start+1为奇数。遍历符合上述条件的子数组,计算所有长度为奇数的子数组的和。start从0开始每次加一,length从1开始每次加2,并且start+length<=arr.length。
第三题
class Solution {
public int numSubarraysWithSum(int[] nums, int goal) {
int count=0;
for(int i=0;i<nums.length;i++){
int sum=0;
for(int j=i;j<nums.length;j++){
sum+=nums[j];
if(sum==goal){
count++;
}
}
}
return count;
}
}
暴力算法,计算从i开始的每一个子数组的和,与goal比较,相等goal加一,i每次循环加一。
第四题
package Leecode2;
import java.util.Scanner;
public class Main4 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int k=scan.nextInt();
int r=scan.nextInt();
int m=0;
for(int i=0;i<k;i++) {
if((k*i-r)%10==0) {
m=i;
break;
}
}
System.out.println(m);
}
}
如果铲子数量 乘以铲子单价再减3后,是10的倍数则符合题意。