一.碎碎念
集训营看来到第二天就要出问题了,今天本来我在开心的敲代码,忽然许久不见回应的某直聘忽然发来面试邀约,就在4月10号,这家工作室也是我写这么多笔试里面少有的比较对我方向的,考的都是关于unity和c#的东西,但是本来工作室老板跟我约的是快到暑假再面,突然改了主意,有点小打乱我在集训营方面的计划了,我要稍稍的准备一些八股和我的项目,所以最近集训营的内容我会减少掉里面我较为不熟悉的cpp,全部用c#完成。还有值得一提的是这是我人生中第一次面试,我真的很紧张,本来就是水货中的水货,简历上还写的天花乱坠,真没想到人家能看上,本来都备战秋招了,现在给我整这一出。不过这也是一次历练的机会,希望我能不怯场吧,加油喵。
二.正文
1.力扣977有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
方法1,遍历+排序
先把数组直接都平方了,然后用个排序函数直接处理掉,非常的方便哈
public class Solution {
public int[] SortedSquares(int[] nums) {
for(int i=0;i<nums.Length;i++){
nums[i]*=nums[i];
}
Array.Sort(nums);
return nums;
}
}
方法2,双指针法
我们继续利用双指针解决这个问题,能注意到题上说它nums之前本来就是非递减顺序排着的,你给他平方完了之后它就有三种可能了,1,它之前全是负数 2,它之前全是正数 3,它之前一半正一半负。那我们想用俩指针,肯定就是左右指针最好,直接拿while遍历一遍,左边设0,右边nums.Length-1,左边右边平方一比,大的放进新数组,然后(左边++/右边--)再次比较,这题就完成了。
public class Solution {
public int[] SortedSquares(int[] nums) {
// 将数组中的每个元素平方
for (int i = 0; i < nums.Length; i++) {
nums[i] *= nums[i];
}
// 创建一个新的数组用于存储排序后的结果
int[] sorted = new int[nums.Length];
// 使用双指针进行插入排序
int left = 0;
int right = nums.Length - 1;
int index = nums.Length - 1; // 从数组的末尾开始插入
while (left <= right) {
if (nums[left] > nums[right]) {
sorted[index] = nums[left];
left++;
} else {
sorted[index] = nums[right];
right--;
}
index--;
}
return sorted;
}
}
力扣209,长度最小子数组
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
方法1,两次遍历
两次遍历直接找出数组里符合条件的最小情况,但是时间复杂度拉满了,过不去新的用例.
public class Solution {
public int MinSubArrayLen(int target, int[] nums) {
int n=nums.Length;
if(n==0){
return 0; //如果数组为0返回0
}
int ans=int.MaxValue; ///初始化一个ans为整形的最大值
for(int i=0;i<n;++i){
int sum=0;
for(int j=i;j<n;++j){ //两次遍历找到所有子数组和
sum+=nums[j];
if(sum>=target)
{
ans=Math.Min(ans,j-i+1); //超了就跳出循环
break;
}
}
}
return ans==int.MaxValue?0:ans; //如果最后ans不变就输出0,变了就输出ans
}
}
方法2,双指针法
这一题要找相邻的长度最小子数组,那就必须得用快慢指针处理最好,快指针只要发现区间的值小于target就往前,慢指针则是发现区间的值大于target才往前,而只有发现区间和等于target的时候再将长度输入到ans里,ans最后如果不变的话再输出0。
public class Solution {
public int MinSubArrayLen(int target, int[] nums) {
int start=0,end=0,sum=0;
int ans=int.MaxValue;
int n=nums.Length;
while(end<n){
sum+=nums[end];
while(sum>=target){
ans = Math.Min(ans, end - start + 1);
sum-=nums[start];
start++;
}
end++;
}
return ans==int.MaxValue?0:ans;
}
}
力扣59,螺旋矩阵Ⅱ
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
只有一个方法吧应该,这一题真是花了我不少力气,一直在出错,c#这个数组的初始化一直报错,直接给二维数组赋值,但是没有给每个一维数组分配内存空间,只给第一行分了,一直给我报空引用,最后写出来一大长串,打开随想录一看人家的代码,比我至少要少20行,时间紧任务重,二刷再加油。(当然我下面给的是随想录的代码)
public class Solution {
public int[][] GenerateMatrix(int n) {
int[][] answer = new int[n][];
for(int i = 0; i < n; i++)
answer[i] = new int[n];
int start = 0;
int end = n - 1;
int tmp = 1;
while(tmp < n * n)
{
for(int i = start; i < end; i++) answer[start][i] = tmp++;
for(int i = start; i < end; i++) answer[i][end] = tmp++;
for(int i = end; i > start; i--) answer[end][i] = tmp++;
for(int i = end; i > start; i--) answer[i][start] = tmp++;
start++;
end--;
}
if(n % 2 == 1) answer[n / 2][n / 2] = tmp;
return answer;
}
}