这章主要是数组,因为面试一般嵌入式不会考很难,这里只维护简单题和稍微简单的中等题。
//卡哥的题目纯手撕,只看逻辑
/*数组
需要数组注意的点:
数组内元素是连续的
int型在32位机器上4字节 ,在64位机器上4字节。
指针型在32位机器上4字节 ,在64位机器上8字节。
*/
#include <vector>
//数组1 二分查找 目的:升序数组找到target 闭区间大法
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
int left = 0,right = n - 1;
int mid = left + (right - left) >> 1;
while (left <= right)
{
if (nums[mid] == target)
return mid;
else if (nums[mid] > target)
right = mid - 1;
else
left = mid + 1;
}
return -1;//没找着
}
};
//数组2 移除元素 原地移除所有数值等于val的元素,并返回移除后数组的长度 只要长度
//第一想法也是双指针
class Solution {
public:
int removeElement(vector<int>& nums, int val)
{
int i = 0,j = 0;
for (i = 0; i < nums.size(); i++)
{
if (val != nums[i])
{
nums[j] = nums[i];
j++;
}
}
//nums[j+1] = '\0'; 加了也行
return j;
}
};
//数组3 有序数组的平方 给你一个有序数组,让你平方后,按照非递减来
//双指针
class Solution {
public:
vector<int>sortSquares(vector<int>& A) {
int k = A.size() - 1;
vector<int> result(A.size(), 0);//从后向前排,因此必须初始化
for (int i = 0, j = A.size() - 1; i <= j)
{
if (A[i] * A[i] < A[j] * A[j])
{
result[k] = A[j] * A[j];
k--;
j--;
}
else
{
result[k] = A[i] * A[i];
k--;
i++;
}
}
return result;
}
};
//数组4 长度最小的子数组
//给定一个含有n个正整数的数组,和一个正整数s,找出该数组中满足其和>=S的长度的最小值
//滑动窗口法。用一个滑动窗口去维护
class Solution {
public:
int minSubArrayLen(int s, vector<int>& num)
{
int result = INT32_MAX;//线给一个最大值,因为要求比较小的
int sum = 0;
int subLength = 0;
int j = 0;//滑动窗口起始位置
for (int i = 0; i < num.size(); i++)
{
sum += num[i];
while (sum >= s)
{
subLength = i - j + 1;
result = result < subLength ? result : subLength;
sum -= num[j];
j++;
}
}
return result == INT32_MAX ? -1 : result;// 注意L:这个就是细节的地方,如果都没有符合的结果,返回-1,不写也行。
}
};
/*至此关于数组的简单题,面试题都已经手撕一遍,主要灵活运用双指针,滑动窗口,注意不能说删除数组中的元素,因为
内存都是连续的,只能去覆盖,注意数组最后一个是'\0'
后边有相关面试题继续补充
*/