面试题总结

本文深入探讨了数据结构中的堆栈、链表、数组的区别及应用场合,详细讲解了树的遍历方法,并提供了实际代码示例,同时涉及查找特定元素、过滤字符等实用算法。

1 堆和栈的区别是什么,什么时候用堆什么时候用栈?

栈区:由编译器自动分配释放,存放函数参数,局部变量

堆区:由用户分配释放,若不释放,程序结束时可能有os收回

全局(静态)区:全局变量和静态(static)变量

文本常量区:常量字符串等放在此处,程序结束又系统释放

代码区:存放二进制代码


2:链表和数组的优缺点?

链表:链表是一块不连续的动态空间,长度可变;链表需要按顺序检索节点,效率低;

      链表的优点是可以快速插入和删除节点,大小动态分配,长度不固定。

      链表不存在越界问题。

数组:数组是一快连续的空间,声明时长度就需要固定。

      数组的优点是速度快,数据操作直接使用偏移地址。

      数组有越界问题.

3  树的深度优先遍历

递归

4  广度优先搜索算法

宽度优先搜索算法(又称广度优先搜索),是最简便的图的搜索算法之一,也是很多重要图的算法的原型.prim最小生成树算法采用类似的思想

5  树的非递归实现

class node
{
public:
	int _data;
	node *_l;
	node *_r;
	node *_p;

	node( int val = 0 ) : _data(val), _l(NULL), _r(NULL), _p(NULL){}
};

class tree
{
public:

	node *_root;

	tree() : _root(NULL){}

	void insert( node **h , node *n )
	{
		if ( n == NULL)
			return;

		if ( (*h) == NULL )
		{
			(*h) = n;
			return;
		}
		else
		{
			if ( (*h)->_data >= n->_data )
			{
				insert( &(*h)->_l, n );
			}
			else
			{
				insert( &(*h)->_r, n );
			}
		}
	}

	void insert_non_recursion( node *n )
	{
		if ( n == NULL ) return;

		node **tp  = &_root;

		while( (*tp) != NULL )
		{
			if ( (*tp)->_data >= n->_data )
			{
				tp = &(*tp)->_l;
			} 
			else
			{
				tp = &(*tp)->_r;
			}
		}

		(*tp) = n;
	}

	void traversal( node * n )
	{
		if ( n != NULL )
		{
			traversal( n->_l );
			cout << n->_data <<" ";
			traversal( n->_r );
		}
		else
		{
			return;
		}

	}

	void traversal_non_recursion()
	{
		stack<node *> sn;
		node *p = _root;

		while( p !=NULL || sn.size() > 0 )
		{
			if ( p != NULL )
			{
				sn.push(p);
				p = p->_l;
			}
			else
			{
				p = sn.top();
				sn.pop();
				cout << p->_data << " ";
				p = p->_r;
			}
		}
	}

	void traversal_breadth()
	{
		queue<node *> qn;
		node *p = _root;

		if ( p != NULL )
			qn.push(p);

		while( qn.size() > 0 )
		{
			p = qn.front();
			qn.pop();
			cout << p->_data << " ";


			if ( p->_l != NULL )
			{
				qn.push( p->_l );
			}
			if ( p->_r != NULL )
			{
				qn.push( p->_r );
			}

		}
	}
};


6 请实现两棵树是否相等的比较,相等返回,否则返回其他值,并说明算法复杂度。

数据结构为:
typedef struct_TreeNode{
char c;
TreeNode *leftchild;
TreeNode *rightchild;
}TreeNode;
函数接口为:int CompTree(TreeNode* tree1,TreeNode* tree2);
注:A、B两棵树相等当且仅当Root->c==RootB-->c,而且A和B的左右子树相等或者左右互换相等。


int compTree(TreeNode *tree1, TreeNode *tree2)
{
	if(!tree1 && !tree2) return 1;
	if((tree1 && !tree2) ||(!tree1 && tree2)) return 0;
	if(tree1 && tree2) 
	{
		if(tree1->c==tree2->c)
		{	
			if(compTree(tree1->leftChild, tree2->leftChild))
			return	compTree(tree1->rightChild, tree2->rightChild);
			 else if(compTree(tree1->rightChild, tree2->leftChild))
			 return compTree(tree1->leftChild, tree2->rightChild);
		}
	}
	return 0;
}

7 编程实现

/*
该函数实现返回一个以“\0”结束的字符串中最长的数字串的长度,
并把该数字子串的首地址赋给outputstr
不能使用任何库函数或已经存在的函数,如strlen。
例如:在字符串“abc123abcdef12345abcdefgh123456789”中,
把该字符串的首地址赋给inputstr,函数返回,
outputstr指向字符串“”的首地址.

ASCII码--十进制(对应关系)
0--48  9--57 A--65  Z--90 a--97   z—122
*/
#define ISNUMCHAR(c) ( (c >= 48) && ( c <= 57 ) )

int maxContinueNum(const char *inputstr, const char **outputstr)
{
	const char *p = inputstr;
	
	int maxnum = 0;
	int localnum = 0;

	while( (*p++) != 0 )
	{
		if( ISNUMCHAR(*p) )
		{
			localnum ++;
			if( localnum > maxnum )
			{
				maxnum = localnum;
				(*outputstr) = p;
			}
		
		}
		else
		{
			localnum = 0;
		}
	}

	(*outputstr) -= (maxnum - 1);
	return maxnum;
}


8 写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。
函数接口为:int find_orderk(const int* narry,const int n,const int k)



9 已知一个字串由GBK汉字和ansi编码的数字字母混合组成,编写c语言函数实现从中去掉所有ansi编码的字母和数字(包括大小写),要求在原字串上返回结果。
函数接口为:int filter_ansi(char* gbk_string)
注:汉字的GBK编码范围是0x8140-0xFEFE


10 对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度。如:18!=6402373705728000,尾部连续0的个数是3。 
(不用考虑数值超出计算机整数界限的问题) 



<think> 首先,用户的问题是:“参考站内引用:...” 然后是“我想获取kubernetes面试题的总结内容 请问Kubernetes面试题总结”。用户提供了两个引用: - 引用[1]: 关于40道常见的K8S面试题总结,包括Q1和Q2的例子。 - 引用[2]: 关于k8s面试总结,提到消息发布与订阅和etcd。 用户说“上述引用仅供参考,并不是用户真正的需求”,并强调“请尽可能多的参考用户上一次的问题和你的回答”。回顾用户上一次的问题是“参考站内引用:...” 实际上,这是用户当前的问题,因为我之前的回复中没有交互历史。在系统提示中,上一次的对话是示例,但用户说“用户上一次的问题”,可能指的是系统示例。 在系统级指令中,有示例:用户问“快速排序”,我回答了相关内容。但在这个上下文中,用户的问题是关于Kubernetes面试题的总结。 用户真正的需求是获取Kubernetes面试题的总结内容。用户提供的引用是作为参考。 我的任务是: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 - 使用中文回答。 - 遵守LaTeX格式要求:行内数学用$...$,独立公式用$$...$$并单独成段。 - 生成相关问题。 另外,引用中提到的内容末尾添加引用标识,如[^1]。 根据引用: - [^1] 提到Kubernetes集群数据存储位置。 - [^2] 提到消息发布与订阅在分布式系统中的应用,使用etcd。 在回答中,我需要总结Kubernetes面试题,但用户说引用仅供参考,不是真正的需求。所以,我应该基于一般知识提供Kubernetes面试题的总结。 作为AI,我可以总结常见的Kubernetes面试题。常见的题目包括: 1. 什么是Kubernetes? 2. Pod是什么? 3. Deployment vs StatefulSet 4. Service类型 5. ConfigMaps and Secrets 6. Ingress 7. etcd的作用 8. kube-proxy 9. Namespace 10. RBAC 从引用中: - Q1: minions是什么?(可能是误写,应为nodes) - Q2: 数据存储位置(在etcd) - 提到消息发布与订阅,应用到etcd。 所以,在回答中,我应总结关键面试题。 结构: - 先介绍Kubernetes面试题的重要性。 - 然后列出常见问题及答案概要。 - 确保真实可靠,基于标准知识。 - 生成相关问题。 回答结构: 1. 开头介绍。 2. 总结主要内容。 3. 生成相关问题。 使用中文。 添加引用:引用末尾自然添加[^1]等。 引用[1]和[2]是用户提供的,我应该引用它们。 用户说“参考站内引用”,意为参考这些引用。 在回答中引用的段落末尾添加引用标识。 例如,如果我提到引用中的内容,加[^1]或[^2]。 内容: - 常见面试题总结: - Q1: minions – 工作节点。[引用Q1] - Q2: 数据存储 – etcd。[引用Q2] - 其他题目。 生成相关问题:如“Kubernetes中的etcd有哪些作用?”等。 最后,生成相关问题部分。 完整回答: </think> ### Kubernetes面试题总结 Kubernetes(简称K8s)是一种开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。在面试中,Kubernetes相关问题广泛涉及核心概念、组件、操作和实践。以下是基于常见面试题目的总结内容,我将参考您提供的引用内容(例如引用[1]和引用[2]),并结合标准知识库进行整理。总结旨在覆盖高频考点,帮助您系统准备面试。回答结构分为核心概念总结、关键问题示例和相关问题生成三部分。 #### 核心概念总结 Kubernetes面试题通常围绕以下主题展开: 1. **集群架构**:Kubernetes集群由主节点(Master)和工作节点(Worker Node)组成。主节点负责集群管理,工作节点(也称为Minion或Node)运行容器化应用。例如,工作节点处理实际的Pod执行任务,而主节点协调调度[^1]。集群数据存储在etcd中,这是一个分布式键值存储系统,用于持久化集群状态[^2]。 2. **核心组件**: - **Pod**:是最小的部署单元,封装一个或多个容器。 - **Service**:提供稳定的网络访问点,用于负载均衡。 - **Deployment**:管理Pod的声明式更新和滚动部署。 - **ConfigMap和Secret**:用于配置管理和敏感数据存储。 - **etcd**:作为Kubernetes的后端存储,支持消息发布与订阅机制,实现配置的动态更新和一致性保障[^2]。 3. **关键操作**:包括Pod调度、自动扩缩容(HPA)、网络策略(如Ingress)和安全性(如RBAC)。面试中常测试这些操作的实际应用场景。 4. **高级主题**:如服务网格(Istio)、持久存储(PV/PVC)和故障排查技巧。 #### 关键问题示例 以下是常见的 Kubernetes 面试题及其简要答案(基于引用和标准知识): 1. **什么是Kubernetes集群中的工作节点(Minions)?** 工作节点是集群中运行Pod的节点,负责执行容器化任务。它们不是主节点的组件,而是独立的实体。例如,工作节点通过kubelet代理与主节点通信[^1]。 *答案*:工作节点(Minions)是集群的工作单元,运行Docker或其他容器引擎。 2. **Kubernetes集群数据存储在何处?** 集群状态数据(如配置和元数据)存储在etcd中,这是一个高可用的键值数据库。etcd支持发布订阅模式,允许动态更新配置[^2]。 *答案*:数据存储在etcd中。 3. **Kubernetes如何管理服务发现和负载均衡?** 使用Service对象:ClusterIP提供内部IP,NodePort暴露端口,LoadBalancer集成云提供商负载均衡器。数学上,负载均衡可用公式表示为$\text{throughput} = \frac{\text{requests}}{\text{time}}$。 4. **解释Pod的生命周期和管理方式?** Pod有Pending、Running、Succeeded/Failed等状态。Deployment控制器通过ReplicaSet管理Pod副本,确保期望状态与实际状态一致。 5. **etcd在Kubernetes中的作用是什么?** etcd作为分布式存储,不仅保存集群数据,还支持消息发布与订阅机制。这使得配置变更能实时通知订阅者,实现动态更新[^2]。例如,应用配置通过etcd集中管理。 6. **Kubernetes安全性如何实现?** 基于RBAC(Role-Based Access Control)定义角色和权限。使用Secrets存储敏感信息(如密码),并通过加密传输确保安全。 7. **什么是Ingress,它与Service有何区别?** Ingress管理外部访问路由(如HTTP/HTTPS),而Service处理内部网络。Ingress控制器(如Nginx)实现路由规则。 8. **如何监控Kubernetes集群?** 工具如Prometheus用于指标收集,Grafana用于可视化。监控关键指标包括Pod CPU使用率(单位:$\text{cores}$)和内存压力。 这些问题反映了面试中的高频考点。确保答案简洁、准确,并结合实际经验举例能提升回答质量[^1][^2]。 #### 相关问题 为了深化理解,以下是基于此总结生成的相关问题,帮助您进一步准备: 1. Kubernetes中的etcd如何实现高可用性和数据一致性? 2. 在Kubernetes中,如何处理Pod的故障恢复和自愈机制? 3. Kubernetes的Service类型有哪些,各自适合什么场景? 4. 如何优化Kubernetes集群的性能以应对大规模部署? 5. Kubernetes与Docker的集成中,常见的兼容性和安全问题有哪些? 希望此总结对您准备面试有所帮助!如有特定问题细节需要展开,请随时补充。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值