自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小强的博客

为了offer

  • 博客(38)
  • 资源 (1)
  • 收藏
  • 关注

原创 重建二叉树

问题描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路分析:利用循环和递归(1)在前序遍历序列中第一个元素一定为整个树的根节点(2)中序遍历中与此元素相等的元素之前的元素属于整个树的左子树,之后元素属于右...

2018-03-28 23:16:46 91

原创 字符串匹配

在文本中查找对应的模式成为字符串匹配:文本:T模式:P一:朴素的字符串匹配算法思路:(1)首先有两个游标i,j指向文本和模式的位置(2)当T[i]=P[j]时i++,j++,继续往下比较。(3)当T[i]!=P[j]时,i回溯到上次开始比较的下一位,j回溯到0(4)当找到一段连续的字符与模式字符串匹配最终模式字符串匹配成功,返回此次开始比较的文本位置。int native_stringmatch(...

2018-03-28 21:47:51 192

原创 链表环

第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x;n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2;此时p1指向环的入口...

2018-03-26 23:05:30 126

原创 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在

class Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers) { int x; int y=numbers.size();//当数组为空时返回0 if(y==0)return 0;//当数组只有一个元素时返回其 if...

2018-03-24 22:18:47 184

原创 从上往下打印出二叉树的每个节点,同层节点从左至右打印

思路:首先从头结点开始,因为一层一层的读取,每读一个节点时,要记录其左右子节点,下一个读取的为其左子节点,然后再次读取其右子节点,所以要存入一个队列依次,然后每次从队列头去节点读取值 int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NU...

2018-03-23 22:49:59 606

原创 已知一个栈的入栈序列,判断给定的一个序列是否为其出栈序列

思路:(1)栈为后入先出序列(2)将入栈序列的元素一个一个入栈然后和出序列中每个元素比较。取序列第一个元素时,把第一个序列的各个元素依次入栈,然后入栈一个后和序列元素比较,如果相同那么将这个元素出栈,并且与序列的第二个元素再进行比较bool IspopOrder(vector<int> pushv,vector<int> popv){bool isPop=false...

2018-03-23 21:48:24 2430

原创 二叉树

二叉树的镜像利用栈实现void MirrorNonRecurively(BinaryTreeNode *pNode)  {      if(NULL == pNode)          return;      stack<BinaryTreeNode *> stackTreeNode;      stackTreeNode.push(pNode);       while(stac...

2018-03-20 21:30:33 161

转载 各种排序算法时间复杂度

各种排序算法比较  各种常用排序算法类别排序方法时间复杂度空间复杂度稳定性复杂性特点最好平均最坏辅助存储 简单 插入排序直接插入O(N)O(N2)O(N2)O(1)稳定简单  希尔排序O(N)O(N1.3)O(N2)O(1)不稳定复杂 选择排序直接选择O(N)O(N2)O(N2)O(1)不稳定  堆排序O(N*log2N)O(N*log2N)O(N*log2N)O(1)不稳定复杂 交换排序冒泡排序...

2018-03-18 17:43:34 759

原创 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。

class Solution {public: /* * @param nums: a list of integers * @return: The majority number that occurs more than 1/3 */ int majorityNumber(vector<int> &nums) { ...

2018-03-16 23:00:25 1422

原创 利用递归返回数组中的最大值

int theMax(int a[],int n){int t;if(n>1){t=f(a,n-1);return t>a[n-1]?t:a[n-1];}elsereturn a[0];}

2018-03-16 22:04:40 637

原创 TCP

TCP通信需要服务器端侦听listen、接收客户端连接请求accept,等待客户端connect建立连接后才能进行数据包的收发(recv/send)工作(面向连接) 而UDP则服务器和客户端的概念不明显,服务器端即接收端需要绑定端口,等待客户端的数据的到来。后续便可以进行数据的收发(recvfrom/sendto)工作。(无连接)基于TCP网络传输的应用程序有时会出现粘包现象(即发送方发送的若干包...

2018-03-15 22:46:40 196

原创 第一次出现的字符位置

思路:(1)建立一个数组包含128个元素,因为字符在ASCLL表中对应的整数值最大为128,而这里只有字母表示而成,故128足够用(2)首先初始化数组元素全为0(3)然后遍历整个字符串,把每个字符对应的ascll整数值对应的元素出现一次就加1 (4)然后最后从字母顺序表示的顺序遍历这个数组,第一个字母出现次数为1 的为所求class Solution {public: int First...

2018-03-14 23:31:39 1808

原创 用两个栈实现一个队列,完成push和pop函数

思路:(1)栈为后入先出,队列为先入先出;(2)进入队列的操作用栈1来完成,然后用栈2来完成出栈操作,把栈1的数据弹出后放入栈2,那么栈1中最后入栈的现在进入栈2的栈底最后出栈,正好实现队列的后入后出,最开始入栈1的数在栈2 的栈顶,最先出队列,相当于在队列的尾部class Solution{public: void push(int node) { stack1.pu...

2018-03-14 22:32:16 2020

原创 将两个有序链表合并为一个

template <class T>struct ListNode{T data;struct ListNode *next;}非递归方法:Struct ListNode *(ListNode*head1,ListNode *head2){struct ListNode *head=new ListNode;struct ListNode *p1=head1;...

2018-03-13 23:00:26 264

原创 C++内存管理总结

内存分配方式:堆,栈,自由存储区,全局区,常量存储区栈:函数内部的局部变量,函数形参等,自动创建自动释放堆:由new delete运算符创建和释放,或者程序结束后os自动回收自由存储区:标准库函数malloc分配的空间全局区:全局变量和静态变量存储的区域常量存储区:存常量,此区域数据不允许被修改,一些字符串常量等放在这里堆和栈的区别:(1)管理方式堆:用户动态创建,用户释放,忘记释放会产生内存泄漏...

2018-03-13 22:36:08 324

原创 C++中const和define区别

const用来定义场量(常量指针,常量值,常量引用,函数参数,函数返回值等)。const变量必须在定义时初始化,而且类中的const变量必须在初始化列表中初始化。(1)const在编译阶段起作用,可以进行调试。#define在预编译阶段起作用,简单替换,不能进行调试(2)const有类型检查,#define无类型检查,const安全程度高(3)编译器不为const变量分配空间而是将其存储在符号表中...

2018-03-13 21:26:03 484

原创

宏实际上就是简单的替换,编译器在编译时完成简单的宏定义有如下格式:[#define指令(简单的宏)]  #define  标识符替换列表(1)简单替换:数组个数的替换#define N 55(注意:无分号)则以后在程序中遇到N都将其替换为55(2)转换字符串#define String(x) # xprintf(String(""""""));将String()里的字符串X原样输出(3)#defi...

2018-03-11 22:10:56 197

原创 static和const

static关键字至少有下列n个作用:   (1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;   (2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;   (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;   (4)在...

2018-03-11 21:44:04 103

原创 编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefg” 函数头是这样的:

void Loopover(char *str,int steps){int len=strlen(str);char tmp[len+3];strcpy(tmp,str+len-steps);strcpy(tmp+2,str);tmp[len]='\0';strcpy(str,tmp);}

2018-03-11 21:11:51 3243 1

原创 迷宫寻址问题

思路:(1)首先为了解决边界问题在一个矩形迷宫的四周围上“一堵墙”,然后不能走,这样就不用特殊处理边界问题了:(2)对迷宫的各个元素可以用一个bool型的二维数组表示,这样可以减少占用的内存空间,0表示可以走,1表示不可以走;(3)对每一个迷宫位置表示为(i,j),对应的矩阵表示为maze[i][j];(4)每个位置相邻有四个方向,每次要选择一个可以走得通没有障碍物的方向行走。所以需要建立一个表示...

2018-03-11 16:55:01 286

转载 多线程面试

 下面就来看看这三类题目吧。   一。概念性问答题   第一题:线程的基本概念、线程的基本状态及状态之间的关系? 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可...

2018-03-10 23:08:44 133

原创 进程和线程

线程和进程的区别进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位。每一个进程都有一个自己的地址空间,即进程空间或(虚空间)。进程空间的大小 只与处理机的位数有关,一个 16 位长处理机的进程空间大小为 216 ,而 32 位处理机的进程空间大小为 232 。进程至少有 5 种基本状态,它们是:初始态,执行态,等待状态,就绪状态,终止状态。线程...

2018-03-09 21:29:47 99

原创 输入一个链表,输出该链表中倒数第k个结点。

ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { int count=0; ListNode *temp = pListHead; //注意,不能返回临时变量,因为临时变量的生存期只在此函数内 while (pListHead != NULL) ...

2018-03-09 21:11:15 227

原创 利用栈离线等价类问题

思路:(1)建立n个表存储关系对,对于关系对(i,j)i在list[j]中j在list[i]中(2)寻找等价类时间复杂度为:O(n)int main(){ int n; int r; cout << "输入元素个数" << endl; cin >> n; if(n<2) { cout << "元素个数太小" <&a

2018-03-07 20:30:53 604

原创 利用栈实现车厢重排

入轨道上的车厢为无序的,出轨道车厢为从右向左递增排序,使的在对应经过车站时可以直接卸载下尾部车厢而不用调整其他车厢。思路:首先要确定出轨道上下一个应来的车厢序号:nextCarToOutput,到达后令其递增缓冲轨道上存入轨道上进来但还不能进入出轨道的车厢,每一个缓冲轨道中从顶部到底部数据递增,如果一个数据进入缓冲轨道,如果所有缓冲轨道顶部的数据都大于这个数据,那么其进入这些数据中最小的对应的缓冲...

2018-03-07 12:58:51 803

原创 利用栈结合递归解决汉诺塔问题

三个数组栈,分别代表三个汉诺塔,刚开始碟子都在汉诺塔1中,要把其移动到2中,利用3作为中转,碟子在塔中从上到下为从小到大,越往下的碟子越大,这里用数字表示大小1~n1->3->2(最底下的一个到2)3->1->2(最底下的一个到2)//全局变量arrayStack<int>tower[4];moveAndShow(int n,int x,int y,in...

2018-03-06 20:03:25 1236

原创 利用栈实现括号匹配

(1)右括号总是与最近的左括号匹配(2)从左往右遍历字符串,遇到左括号就入栈,然后遇到右括号时就把它与栈顶出元素对应的左括号匹配(3)当栈为空时遇到右括号则此右括号无匹配的左括号(4)当最终右括号匹配完毕后栈内还有剩余元素则表明这些位置的左括号没有与之匹配的右括号void printMatchedPairs(string exper){int length=(int) exper.size...

2018-03-06 18:57:30 5205

原创 二维数组指针指向问题

&a为取的整个数组的地址,故&a+1为数组后的地址,ptr-3为数组中倒数第三个元素的地址。故值为9p为数组指针,指向含有三个整形元素的数组:p[0]为数组第一行首地址,p[0]+1即为&p[0][1],*(p[0]+1)即为n[0][1]=20p为二级指针,*p为数组第一行首地址即为p[0],(*p)[2]即为p[0][2]=n[0][2]=30在C语言中,若有定义:in...

2018-03-05 23:17:49 326

原创 C++头文件编译:#pragma once和#ifndef

#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被...

2018-03-05 22:40:36 552

原创 搜狗测试面试总结

搜狗面试总结题目:计算机网络方面:TCP/IP协议知识,三次握手的详细过程,等待时间等也要具体掌握get和post协议知识,两者的区别以及工作原理搜索引擎进行搜索的过程C++知识:一个整数的二进制表达中1的个数while(n!=0){++count;n=n&(n-1);}字符串反转(常规表达,递归方法):void Reverse(char *s) { int n...

2018-03-05 22:19:40 5689

转载 面试过程中的算法题

算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。而根据统计,以下这18个问题是面试中最容易遇到的,本文给出了一些基本答案,供算法方向工程师或对此感兴趣的程序员参考。1)请简单解释算法是什么?算法是一个定义良好的计算过程,它将一些值作为输入并产生相应的输出值。简单来说,它是将输入转换为输出的一系列计算步骤。2)解释什么是快速排序算法?快速排序算法能够快速排序列表或查询。它基于分割交换排...

2018-03-04 17:11:11 315

转载 Linux命令

1.添加执行权限:chmod 777     chmod u+x 文件名(可执行权限)2.创建与删除目录:mkdir  目录名   (只能建一个目录)                                         mkdir -p  test1/test2/test3   (-p表示可以建多级目录)                               mkdir -m  ...

2018-03-03 20:37:38 136

原创 冒泡排序,选择排序,插入排序,快速排序

一:冒泡排序冒泡排序算法的运作如下:(从后往前)比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。冒泡排序总的平均时间复杂度为  。相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定...

2018-03-03 17:28:12 327

原创 C++中字符串反转

一:#include <iostream> using namespace std;void Reverse(char *s) { int n = strlen(s); for (int i = 0, j = n - 1; i<j; i++, j--) { char c = s[i]; s[i] = s[j]; s[j] = c; }}int ma...

2018-03-03 16:46:25 427

转载 Linux命令大全

Linux常用命令大全最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。为了方便大家查找linux的相关命令,我就将我了解到的命令列举一下,仅供大家参考:系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器...

2018-03-03 11:17:52 152

原创 斐波那契数列和应用举例我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

首先介绍一下斐波那契数列     斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2...

2018-03-02 13:12:10 1217

原创 反转链表

/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/ListNode* ReverseList(ListNode* pHead){ListNode *p;ListNode*p1=head;ListNode *p2=NULL...

2018-03-02 10:39:46 122

原创 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序

(1)链表为空的情况if(!pHead){return;}(2)链表只有一个节点的情况以及在遍历链表的过程中考虑当前只有一个结点的情况从头遍历链表,对每一个节点复制一个,插在它后边;接着遍历这个链表,那么原链表中节点的特殊指针若为空,则复制链表对应节点的特殊指针也为空,若源链表中结点的特殊指针不为空,那复制链表中对应节点的特殊指针为原链表中结点特殊指针的->next。class Sol...

2018-03-01 12:53:59 630

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除