给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组:
子数组大小 至少为 2 ,且
子数组元素总和为 k 的倍数。
如果存在,返回 true ;否则,返回 false 。
如果存在一个整数 n ,令整数 x 符合 x = n * k ,则称 x 是 k 的一个倍数。0 始终视为 k 的一个倍数。
示例 1:
输入:nums = [23,2,4,6,7], k = 6 输出:true 解释:[2,4] 是一个大小为 2 的子数组,并且和为 6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/continuous-subarray-sum
package JavaPackageOne; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashMap; import java.util.Map; class Solution { public static boolean checkSubArraySum(int[] nums, int k) { int m = nums.length; if (m < 2) { return false; } Map<Integer, Integer> map = new HashMap<>(); map.put(0, -1); int remainder = 0; for (int i = 0; i < m; i++) { remainder = (remainder + nums[i]) % k; if (map.containsKey(remainder)) { int prevIndex = map.get(remainder); if (i - prevIndex >= 2) { return true; } } else { map.put(remainder, i); } } return false; } public static int[] stringToInt(String[] arr) { int[] ints = new int[arr.length]; for (int i=0; i<arr.length; i++) { ints[i] = Integer.parseInt(arr[i]); } return ints; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; while ((str = br.readLine()) != null) { try { // nums String[] arr = str.split(", "); String[] arr1 = arr[0].split(" = "); String[] numsArray = arr1[1].replace("[", "").replace("]", "").split(","); String[] arr2 = arr[1].split(" = "); int k = Integer.parseInt(arr2[1]); int[] nums = stringToInt(numsArray); System.out.println(checkSubArraySum(nums, k)); } catch (Exception e) { // e.printStackTrace(); // 回车一行就退出 break; } } } }View Code
输入:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str; while ((str = br.readLine()) != null) { // 执行的代码块 }
## String[]数组转int[]数组:
public static int[] stringToInt(String[] arr) { int[] ints = new int[arr.length]; for (int i=0; i<arr.length; i++) { ints[i] = Integer.parseInt(arr[i]); } return ints; }