【复盘】六月集训(第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; }}