程序员校招准备嵌入式软件面试的手撕代码练习

这章主要是数组,因为面试一般嵌入式不会考很难,这里只维护简单题和稍微简单的中等题。

//卡哥的题目纯手撕,只看逻辑

/*数组
需要数组注意的点:
数组内元素是连续的
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'
后边有相关面试题继续补充

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值