> 文档中心 > 【复盘】六月集训(第01天)——数组

【复盘】六月集训(第01天)——数组

【复盘】六月集训(第01天)——数组

    • 一、前言
    • 二、题目链接
    • 三、解题思路
      • 1588. 所有奇数长度子数组的和
      • 1848. 到目标元素的最小距离
      • 1652. 拆炸弹
      • 1640. 能否连接形成数组

一、前言

本篇文章是根据英雄哥的六月集训的直播刷题写的复盘。
今天第一天,也是第一次参加,没有预习题目,所以代码参考了英雄哥的代码。

欢迎大佬们批评指正

二、题目链接

1588. 所有奇数长度子数组的和
1848. 到目标元素的最小距离
1652. 拆炸弹
1640. 能否连接形成数组

三、解题思路

1588. 所有奇数长度子数组的和

定义左右两个指针,先把左指针定住,右指针右移,sum用于记录数组在左右指针之间区域的和,当左右指针之间的区间大小为奇数时,res加上sum。 当右指针到达数组右端后把左指针右移重复上述步骤。

代码:

class Solution {    public int sumOddLengthSubarrays(int[] arr) { int res = 0; int left = 0; int right = 0; int sum = 0; for(left = 0;left < arr.length;left++) {     sum = 0;     for(right = left;right < arr.length;right++) {  sum += arr[right];  if((right - left + 1)%2 == 1) {      res += sum;  }     } } return res;    }}

1848. 到目标元素的最小距离

这道题直接根据题目的描述就可以做出来

代码:

class Solution {    public int getMinDistance(int[] nums, int target, int start) { int min = Integer.MAX_VALUE; for(int i = 0;i < nums.length;i++) {     if(nums[i] == target) {  min = Math.min(min,Math.abs(i - start));     } } return min;    }}

1652. 拆炸弹

  • 这道题分为三种情况,即k > 0,k < 0,k = 0。分情况把每个数组元素的值分别计算即可。
  • 一个需要注意的点就是,这是一个循环数组,我们需要利用取模的方式来防止出现数组溢出问题。

代码:

class Solution {    public int[] decrypt(int[] code, int k) { int val = 0; int n = code.length; int[] res = new int[n];  for(int i = 0;i < code.length;i++) {     val = 0;     if(k > 0) {  for(int j = i + 1;j <= i + k;j++) {  //注意防止数组溢出的方式      val += code[j%n];  }     }else if(k < 0) {  for(int j = i - 1;j >= i + k;j--) {  //注意防止数组溢出的方式      val += code[(j % n + n) % n];  }     }     res[i] = val; } return res;    }}

1640. 能否连接形成数组

  • 定义一个指针i指向arr数组的第一个元素,然后遍历pieces数组的每一行,判断每一行的第一个元素是否和arr[i]相等,若相等则继续比较pieces数组当前行后面的元素是否和arr[i] 后面的元素相等,若不相等,继续寻找下一行。
  • 这样有一个问题,即若在pieces数组中一直找不到第一个元素和arr[i]相等,i的值一直不变,就会陷入死循环,所以我们需要添加一个flag来判断在遍历一次pieces数组过程中是否找到了pieces数组中的某一行的第一个元素和arr[i]相等,若遍历完一次pieces数组后没有找到pieces数组某一行的第一个元素和arr[i]相等,则直接返回false

代码:

class Solution {    public boolean canFormArray(int[] arr, int[][] pieces) { int i = 0; boolean flag = false; while(i < arr.length) {     flag = false;     for(int j = 0;j < pieces.length;j++) {  if(pieces[j][0] != arr[i]) {      continue;  }  for(int k = 0;k < pieces[j].length;k++) {      if(pieces[j][k] == arr[i]) {   flag = true;   i++;      }else {   return false;      }  }  if(i == arr.length) {      return true;  }     }     if(!flag) {  return false;     } } return true;    }}