1. public class Solution {
    2. /**
    3. * 原问题:字段奇数数量
    4. * 新问题转化为:奇数看为1,偶数看为了(其实就是把数 % 2),统计字段和为K的字段数量
    5. * sum(l,r) == k
    6. * S[r] - S[l - 1] == k S是字段和数组
    7. * 其实就是两数之差问题。枚举右端i(r),只需找到i 前面右多少个j(l-1)满足s[i] - s[j] == k
    8. * @param nums
    9. * @param k
    10. * @return
    11. */
    12. public int numberOfSubarrays(int[] nums, int k) {
    13. Integer res = 0;
    14. // 1:先计算出前缀和数组。注意前缀和数组要比nums长一位,因为为了方便从下表1开始走
    15. int[] s = new int[nums.length + 1];
    16. s[0] = 0;
    17. for(int i = 1;i <= nums.length;i++){
    18. //这里加数组的值
    19. s[i] = s[i - 1] + nums[i - 1]%2;
    20. }
    21. //3 : 接下来就变成两数之差问题了。
    22. Map<Integer,Integer> map = new HashMap<>();
    23. for(int i : s){
    24. if(i - k >= 0){
    25. res = res + map.getOrDefault(i-k,0);
    26. }
    27. int num = map.getOrDefault(i,0) + 1;
    28. map.put(i,num);
    29. }
    30. return res;
    31. }
    32. }