剑指offer(二)

源码如下:

//面试题3 二维数组的查找
class two_demision_find
{
public:
	two_demision_find(int (*tem)[4],int n)
	{
		for(int i=0;i<n;i++)
		{
			vector<int> str;
			for(int j=0;j<4;j++)
			{
				str.push_back(tem[i][j]);
			}
			result.push_back(str);
		}
	}
	bool hadfound(int dest,int n,int m) const
	{
		int i=0;  //i表示行
		int j=m-1;  //j表示列
		while(true)
		{
			if(dest<result[i][j])
			{
				j--;
			}
			else if(dest>result[i][j])
			{
				i++;
			}
			else
				return true;
			if(i>=n||j<0)
				return false;
		}
	}
private:
	vector<vector<int>> result;
};

//面试题4 替换空格  把空格替换为指定的字符串
class replace_space
{
public:
	void start_1(char *str,int size)  //另外开辟内存空间复杂度为O(n),时间复杂度为O(n);
	{
		vector<char> result;
		for(int i=0;i<size;i++)
		{
			if(str[i]==' ')
			{
				result.push_back('%');
				result.push_back('2');
				result.push_back('0');
			}
			else
				result.push_back(str[i]);
		}
		for(auto i:result)
			cout<<i;
		cout<<endl;
	}
	void start_2(char *str,int size)  //空间复杂度为O(1),时间复杂度为O(n);
	{
		//先遍历一遍看有几个空格
		int space_num=0;
		for(int i=0;i<size;i++)
		{
			if(str[i]==' ')
				space_num++;
		}
		char *p1=str+size;
		size+=2*space_num;
		char *p2=str+size;

		while(p1!=p2)
		{
			if(*p1==' ')
			{
				*p2--='0';
				*p2--='2';
				*p2--='%';
				p1--;
			}
			else
			{
				*p2--=*p1--;
			}
		}
		cout<<str<<endl;
	}
};

//实现strtok函数
class mystrtok
{
public:
	char* operator()(char *src,const char *delim,char **save_ptr)
	{
		char *token=nullptr;
		if(src==nullptr)
			src=*save_ptr;
		src+=_strspn(src,delim); //第一次src不为空,delim第一个不在s中的位置,_strspn(src,delim)返回0
		if(*src=='\0')
			return NULL;
		token=src;
		///*******??????
		src=_strpbrk(src,delim); //返回最早出现在src中的位置后的字符串,包括自身
		if(src==NULL)
		{
			*save_ptr=_strchr(token,'\0');
		}
		else
		{
			*src='\0';
			*save_ptr=src+1;
		}
		return token;
	}
public:
	//检查delim第一个不在s中的位置
	int _strspn(char *s,const char* delim)    
	{
		if(s==nullptr||delim==nullptr)
			return 0;
		int n=0;
		bool flag=false;
		for(int i=0;i<strlen(s);i++)
		{
			//判断delim的中的字符是否在s中
			for(int j=0;j<strlen(delim);j++)
			{
				if(delim[j]==s[i])
				{
					n++;
					flag=true;
					break;
				}
				
			}
			if(!flag)
				return n;
			flag=false;
		}
		return n;  //返回的是n=0
	}
	//字符串s中首次出现dest的位置
	char *_strchr(char *s,char dest)
	{
		if(s==nullptr||dest==NULL)
			return nullptr;
		int n=0;
		for(int i=0;i<strlen(s);i++)
		{
			if(dest==s[i])
				return s+n;
			else
				n++;
		}
		if(n==strlen(s))
			return NULL;
		else
			return s;
	}
	//检查字符串delim在s中最早出现的位置后的字符串
	char *_strpbrk(char* s,const char* delim)
	{
		if(s==nullptr||delim==nullptr)
			return nullptr;
		int min=0xffff;
		//int n=0;
		for(int i=0;i<strlen(delim);i++)
		{
			for(int j=0;j<strlen(s);j++)
			{
				if(delim[i]==s[j])
				{
					min=j<min?j:min;
				}
			}
		}
		if(min==0xffff)  //没有找到相应的分割字符串
			return NULL;
		else
			return s+min;
	}
};

//面试题6: 重建二叉树
struct List_Node
{
	char data;
	List_Node *left_child;
	List_Node *right_child;
};
class Recreate_Tree
{
public:
	void start(char* pre_order,char* in_order,int length)
	{
		if(pre_order==NULL||in_order==NULL||length<=0)
			return ;
		List_Node *head=create_tree(pre_order,pre_order+length-1,in_order,in_order+length-1);
		back_order(head);
	}
	List_Node* create_tree(char *pre_start,char *pre_end,char *in_start,char *in_end)
	{
		List_Node *root=new List_Node;
		root->data=*pre_start;
		root->left_child=NULL;
		root->right_child=NULL;
		if(pre_start==pre_end)
		{
			if(in_start==in_end&&*pre_start==*in_start)
			{
				return root;
			}
			else
				throw exception("错误");
		}
		int in_num=0;
		while(*(in_start+in_num)!=*pre_start&&(in_start+in_num)<=in_end)
			in_num++;
		if((in_start+in_num)==in_end&&*(in_start+in_num)!=*in_end)
			throw exception("not found element in in_order");
		if(in_num>0)  //开始这个条件考虑错误
			root->left_child=create_tree(pre_start+1,pre_start+in_num,in_start,in_start+in_num-1);

		if(in_num<pre_end-pre_start)
			root->right_child=create_tree(pre_start+in_num+1,pre_end,in_start+in_num+1,in_end);

		return root;
	}

	void back_order(List_Node *head)
	{
		if(head==nullptr)
			return;
		back_order(head->left_child);
		back_order(head->right_child);
		cout<<head->data<<" ";
	}
};

//两个队实现一个栈
class queue_stack
{
public:
	void start()
	{
		while(true)
		{
			cout<<"1、插入		2、出栈		0、退出"<<endl;
			short choose=0;
			int num=0;
			cin>>choose;
			switch(choose)
			{
			case 0:
				exit(0);
			case 1:
				cin>>num;
				q1.push(num);
				break;
			case 2:
				if(q1.empty())
				{
					cout<<"没有更多元素了,请插入元素或退出!"<<endl;
					break;
				}
				else
				{
					while(q1.size()!=1)
					{
						q2.push(q1.front());
						q1.pop();
					}
					cout<<q1.front()<<endl;
					q1.pop();
					//把q2中的元素还原到q1中
					while(!q2.empty())
					{
						q1.push(q2.front());
						q2.pop();
					}
				}
				break;
			default:
				cout<<"No that choose!"<<endl;
				break;
			}
		}
	}
private:
	queue<int> q1;
	queue<int> q2;
};

//面试题15:删除倒数第k个结点的相关题目:输出链表中间元素
class middle_List
{
public:
	void start(int *list,int n)
	{
		if(list==NULL||n<=0)
			return;
		int p1=0;
		int p2=0;
		while(p2+2<=(n-1))
		{
			p1+=1;
			p2+=2;
		}
		cout<<list[p1]<<endl;
	}
};
//中兴机试题:页面置换算法
class test
{
public:
	float waitingTimeSJF(int *requestTimes, int *durations, int n)
	{
		int cpu_time = 0;
		float wait_time = 0;
		vector<int> vec_flag(n,0);
		vector<int> vec_ready(n,0);

		int vec_ready_n = 0;
		int cur = 0;
		int next = 0;
		int min = 101;
		for (int i = 0; i<n; i++)
		{
			wait_time = wait_time + (cpu_time - requestTimes[cur]);
			cpu_time += durations[cur];
			vec_flag[cur] = 1;   //把已完成任务标记
			vec_ready_n = 0; //已经运行完的任务的个数
			for (int j = 0; j<n; j++)
			{
				if (vec_flag[j] == 0 && requestTimes[j] <= cpu_time) //找出已经请求了的任务
				{
					vec_ready[vec_ready_n++] = j;
				}
			}
			min = 65535;
			for (int k = 0; k<vec_ready_n; k++)//找出执行时间最短的程序
			{
				if (durations[vec_ready[k]]<min)
				{
					min = durations[vec_ready[k]];
					next = vec_ready[k];
				}
			}
			cur = next;
		}
		return (wait_time / n);
	}
};

//面试题16:翻转链表
struct List
{
	int data;
	List *next;
};

class My_List
{
public:
	List* create_List()
	{
		List *head=new List;
		head->data=-1;
		head->next=NULL;

		int data=0;
		List *tem=head;
		while(cin>>data)
		{
			if(data<0)
				return head->next;
			List *node=new List;
			node->data=data;
			node->next=NULL;
			tem->next=node;
			tem=tem->next;
		}
		return head->next;
	}

	List* reverseList(List* head)
	{
		if(head==NULL)
		  return NULL;
		List *pre=NULL;
		List *pnode=head;
		List *pnext=pnode->next;
		while(pnode->next!=NULL)
		{
			pnode->next=pre;
			pre=pnode;
			pnode=pnext;
			pnext=pnext->next;
		}
		pnode->next=pre;
		return pnode;
	}
	void print(List *head)
	{
		while(head!=NULL)
		{
			cout<<head->data<<"-->";
			head=head->next;
		}
		cout<<"NULL"<<endl;
	}
};

//面试题20 :顺时针打印矩阵
class clock_print
{
public:
	void start(int str[][1],int n,int m)
	{
		int x_start=0,x_end=n-1;
		int y_start=0,y_end=m-1;

		while(x_start<=x_end||y_start<=y_end)
		{
			//左到右打印
			if(y_start<=y_end)
			{
				for(int i=y_start;i<=y_end;i++)
				{
					cout<<str[x_start][i]<<" ";
				}
			}
			x_start++;

			//从上到下打印
			if(x_start<=x_end)
			{
				for(int i=x_start;i<=x_end;i++)
				{
					cout<<str[i][y_end]<<" ";
				}
			}
			y_end--;

			//从右到左打印
			if(y_end>=y_start)
			{
				for(int i=y_end;i>=y_start;i--)
				{
					cout<<str[x_end][i]<<" ";
				}
			}
			x_end--;

			//从下往上打印
			if(x_end>=x_start)
			{
				for(int i=x_end;i>=x_start;i--)
					cout<<str[i][y_start]<<" ";
			}
			y_start++;
		}

	}
};

//面试题 22:栈的压入弹出序列
#include <stack>
class Stack_push
{
public:
	bool is_pop(vector<int> push_stack,vector<int> pop_stack)
	{
		if(push_stack.empty()||pop_stack.empty()||pop_stack.size()!=push_stack.size())
			return false;
		int i=0,j=0;
		stack<int> tem;
		while(j<pop_stack.size())
		{
			while(tem.empty()||tem.top()!=pop_stack[j])
			{
				if(i>=push_stack.size())
					break;
				tem.push(push_stack[i]);
				i++;
			}
			if(tem.top()!=pop_stack[j])
				break;
			tem.pop();
			j++;
		}
		if(tem.empty()&&j==pop_stack.size())
			return true;
		return false;
	}
};

//面试题 24:判断一个序列是否是搜索二叉树的后序遍历
class Is_Backorder
{
public:
	bool start(int *seq,int num)
	{
		if(seq==nullptr||num<=0)
			return true;
		int i=0,j=0;
		int root=seq[num-1];
		for(;i<num-1;i++)
		{
			if(seq[i]>root)
				break;
		}
		j=i;
		for(;j<num-1;j++)
		{
			if(seq[j]<root)
				return false;
		}

		return start(seq,i)&&start(seq+i,num-i-1);
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值