栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2022 5 字节实习一面--- Pico

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2022 5 字节实习一面--- Pico

文章目录
  • 第一部分 自我介绍+项目
  • 第二部分 基础知识
  • 第三部分 代码题

第一部分 自我介绍+项目

10min自我介绍和项目介绍(项目没怎么深挖,大概了解了一下)


第二部分 基础知识

20min左右;
面试官是根据简历上的内容有针对性的提问的,有些知识在问你之前还会先问问你掌握的怎么样,平时自己做项目接触到的多嘛。挺人性化的哈哈哈哈 不会也没啥关系
具体如下:
ISO七层网络模型 每一层的作用以及每一层有哪些协议;
了解Http 1.0 和http 2.0 嘛
Http状态码 直接问的503服务器不可访问 这个好像很特别 ;
进程 线程和协程;
TCP UDP的异同;
三次握手 四次挥手 为什么不两次握手或者四次握手 而是三次?我这里只考虑了两次握手的情况 四次握手应该也类似吧;
进程通信IPC的几种方式;
Linux内核相关的知识;Linux下信号有哪几种形式?比如 按下ctrl+c后退出的过程信号是怎样传递的,这块不是很熟悉;
熟悉的数据结构,常规问题 数组和链表的区别;
穿插问了一下怎么判断链表是不是有环
还问了C++对数组的大小改变是怎样实现的;(面试官的意思是让我介绍下C++是怎么实现数组容量改变的。这里会涉及到数组越界问题)
还谈到了vector的二倍扩容机制;
还谈到了堆栈的区别;
还谈到栈和队列的区别;
问了全局变量存放在堆还是栈(堆)
一些函数参数 返回值 局部变量等存放在哪(栈)
实际应用中 ,哪些地方会用到堆哪些地方会用到栈;我答的递归的本质是用栈实现的;很显然没理解面试官的意思;


第三部分 代码题

20min左右
经典题目:求小于给定数字n的最大数

参考了几种解题思路 现给出以下几种方案:

方案一:逐位比较(存在一些问题) 确定(也是面试官提示我的写法)

//小于n的最大数
//假设给定的数组是 [1,2,4,9] n=2533 则返回的最大数是2499
class Solution
{
public:
	vectormaxNumber(const vector& nums, int n)
	{
		vectorarr, ans;//arr存放给定数字的每一位;ans返回最终的结果
		int minChoose = 10, maxChoose = 0;
		bool exist[10];
		for (int x : nums)
		{
			exist[x] = true;
			minChoose = min(minChoose, x);//可选择的最小值 给定例子中就是1 
			maxChoose = max(maxChoose, x);//可选择的最大值 给定的例子中就是9
		}
		while (n)
		{
			arr.push_back(n % 10);//将n的每一位存到数组中
			n /= 10;
		}
		reverse(arr.begin(), arr.end());//答案应尽可能和num位数相同 若位数相同无解 则答案减少一位且每位取最大值 
		for (int i = 0; i < arr.size(); i++)   //arr[i]是当前位 arr[i+1]是后一位
		{                //待选择的后一位大于等于可选数字的最小值时,当前位才可以选等值;否则只能选小于的值
			int j = (i == arr.size() - 1 || arr[i + 1] >= minChoose ? arr[i] : arr[i] - 1); //j是你所找数字的最高位
			while (j >= 0 && !exist[j])
			{
				j--;  //j=0 j--之后-1小于0 考虑最高位是1的情况
				if (j < 0)//同位数无解 降低解的位数 ;因为位数是少于给定数字位数的 所以所有的位都取最大值即可;
				{
					ans.clear();
					for (int k = 0; k < arr.size() - 1; k++)
					{
						ans.push_back(maxChoose);
					}
					break;
				}
				if (j != arr[i])//当前位取了小于原数同位的值 则解就确定了 后面每一位都可以取最大值;
				{
					ans.push_back(j);
					while (ans.size() < arr.size())
					{
						ans.push_back(maxChoose);
					}
					//break;
				}
				ans.push_back(j);//当前位取了等于原数同位的值 直接将当前位放入结果数组中即可
			}
		}
		return ans;
	}
};


int main()
{
	vectornums = { 1,2,4,9};
	int n = 2533;
	vectorres;
	//int ans;
	Solution so;
	//res=so.maxNumber(nums, n);
	res = so.maxNumber(nums,n);
	for (auto it = res.begin(); it != res.end(); it++)
	{
		cout << *it;
	}
	system("pause");
	return 0;
}

方案二:全排列的思路(回溯) ---测试案例都是成功的

#include
using namespace std;
#include
#include
#include
#include
#include


//全排列+回溯
//给定一个数组nums和一个指定的数字n,用数组中的数字组成一个整数 使得这个整数是不大于n的最大数;
class Solution
{
public:
	vectorvec;//存储一个结果集合
	string path;//存储单个数字的集合
	int findMax(vector& nums, int n)
	{
		int ans = 0;
		dfs(nums, n);
		int maxValue = -1;//初始化这个最大的数为-1
		for (int i = 0; i < vec.size(); i++)
		{
			if (vec[i] > maxValue)
			{
				maxValue = vec[i];//维护一个较大的数
			}
		}
		return maxValue;
	}
	void dfs(vector& nums, int x) {
		if (path.size() > 0 && stoi(path) >= x)
			return;
		for (int i = 0; i < nums.size(); i++) {
			path += to_string(nums[i]);//用数组中的数字组成数字
				if (stoi(path) < x) {
				vec.push_back(stoi(path));
			}
			dfs(nums, x);
			path.pop_back();
		}
	}
};

int main()
{
	vector nums = {5,6,7};
	int x = 120;
	Solution so;
	int ans = 0;
	ans = so.findMax(nums, x);
	cout << ans<< endl;
	system("pause");
	return 0;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883542.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号