2025年--Lc228-523. 连续的子数组和(带测试用例)-Java版
1.题目


2.思路



若在下标 a 和 b(a < b)处有 P[a] % k == P[b] % k,
那么 连续子数组 就是 nums[a+1 … b],其和能被 k 整除。

3.代码实现
import java.util.HashMap;public class checkSubarraySum {public boolean checkSub(int[] nums,int k) { //nums中的元素都是0,k也是0if (k == 0) {for (int i = 0; i < nums.length; i++) {if (nums[i] == 0 && nums[i - 1] == 0) {return true;}return false;}}//hashmap有数据覆盖的风险,首先key存余数的值,vallue余数第一次出现的数组下标//(0,-1)代表余数是0的特殊情况,最上面已经做了判断HashMap<Integer, Integer> ma = new HashMap<>();ma.put(0, -1);int sum = 0;for (int i = 0; i < nums.length; i++) {sum = sum + nums[i];int rest = (int) (sum % k);//rest保存余数的值。if (rest < 0) {rest = rest + k;}//如果余数小于0,则做负余数变正余数操作,也就是加上他们除的那个数(周期)Integer ids = ma.get(rest);if (ids != null)//考虑索引不是空的情况{//ids是某个余数第一次出现的位置。if (i-ids>= 2)//长度要大于等于2,且是同余数的情况{return true;} else {// 如果这个余数还没出现过,记录它的第一次出现位置ma.put(rest, i);}}}return false;}public static void main(String[] args){ int[] nums = {23,2,4,6,7};int k = 6;checkSubarraySum test=new checkSubarraySum();boolean flag=test.checkSub(nums,k);System.out.println(flag);}}