1.给你一个整数数组 nums
,请计算数组的 中心下标 。
数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。
如果中心下标位于数组最左端,那么左侧数之和视为 0
,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。
如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1
。
将数组所有元素之和设出为a,设左侧元素之和为sum,那么右侧元素之和为a-sum-nums[i],利用左右元素相等有a-sum-nums[i]==sum。所以当 2*sum==a-nums[i]时,返回元素i的值。
class Solution {
public int pivotIndex(int[] nums) {
int a=Arrays.stream(nums).sum();//a:数组所有元素之和
int sum=0;//sum:左侧元素之和
for(int i=0;i<nums.length;i++){
if(2*sum==a-nums[i]){
return i;
}
sum+=nums[i];
}
return -1;
}
}
2.给定一个整数数组 nums
和一个整数 k
,返回其中元素之和可被 k
整除的(连续、非空) 子数组 的数目。
子数组 是数组的 连续 部分。
令 P[i]=nums[0]+nums[1]+…+nums[i];连续子数组的和为sum(i,j)=P[j]-P[i-1],判断和是否能够被k整除的办法就是令(P[j]-P[i-1])%k==0,即P[j]%k==0;P[i-1]%k==0(同余定理:数论中的重要概念。给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系)。
利用哈希表(HashTable):(4条消息) 哈希表(HashTable)_吃米饭的博客-CSDN博客
class Solution {
public int subarraysDivByK(int[] nums, int k) {
int n=nums.length;//数组长度
int ans=0;//子数组个数
int[] sum=new int[n+1];//各个子数组的和
for(int i=0;i<n;i++){
sum[i+1]=sum[i]+nums[i];//子数组中后一个元素的和等于前一个元素的值加上A中元素的值
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
int a=sum[j]-sum[i];
if(a%k==0){
ans++;
}
}
}
return ans;
}
}