题解 | #子群的标签和# java
子群的标签和
https://www.nowcoder.com/practice/4058a95b317f4f0e87e5a1bfa6db9aad
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param k int整型 * @return int整型二维数组 */ public int[][] subarraySum (int[] nums, int k) { // write code here List<List<Integer>> result = new ArrayList<>(); HashMap<String, List<Integer>> resultMap = new HashMap<>(); int size = nums.length; for (int left = 0; left < size; left++) { int sum = 0; for (int right = left; right < size; right++) { sum += nums[right]; if (sum == k) { List<Integer> subarray = new ArrayList<>(); for (int i = left; i <= right; i++) { subarray.add(nums[i]); } StringBuilder sb = new StringBuilder(); for (int num : subarray) { sb.append(num).append(","); } String subarrayStr = sb.toString(); if (!resultMap.containsKey(subarrayStr)) { resultMap.put(subarrayStr, subarray); result.add(subarray); } } } } int[][] res = new int[result.size()][]; for (int i = 0; i < result.size(); i++) { List<Integer> subarray = result.get(i); res[i] = new int[subarray.size()]; for (int j = 0; j < subarray.size(); j++) { res[i][j] = subarray.get(j); } } return res; } }
使用的是Java语言。
该题考察的知识点是数组遍历和子数组求和。
- 使用HashMap
resultMap
来存储已经存在的子数组的字符串表示和对应的子数组对象。 - 遍历数组
nums
,使用两层循环,外层循环控制子数组的起始位置left
,内层循环控制子数组的结束位置right
。 - 在内层循环中,通过不断累加元素的和
sum
,判断当前子数组的和是否等于k
,如果相等,则找到了一个符合条件的子数组。 - 将符合条件的子数组存储在一个新的ArrayList
subarray
中,并将其转换为字符串形式subarrayStr
。 - 判断
resultMap
中是否已经包含了相同的子数组,如果不包含,则将其加入resultMap
和result
中。 - 循环结束后,将
result
转换成二维整型数组res
返回。