剑指Offer面试题1
面试题1:
题目描述:
如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
private:
char* m_pData;
};
思路: 现代写法,传一个临时参数tmp,然后将tmp的m_pData值与this指针指向的值进行交换,就实现了运算符的重载。
注:tmp出了作用域会自动调用析构函数释放,所以当tmp区域与this指向的为同一区域时,tmp释放,则this指针
指向的区域也释放了,就会出现问题,所以需要加上条件(this!=&str)。
代码:
CMyString& CMyString::operator=(const CMyString& str)
{
if (this != &str)
{
CMyString temp(str); char* data = temp.m_pData;
temp.m_pData = this->m_pData;
this->m_pData = data;
}
return *this;
}
面试题3:
题目描述:
思路:从二维数组的左下角开始找,若当前位置比target小,则向右移;反之,向上移动。
代码:
class Solution
{
public:
bool Find(vector<vector<int> > array,int target)
{ int row =array.size(); //行
int col=array[].size(); //列
int x=row-; //横坐标
int y=; //纵坐标
while(x>= && y<col)
{
if(array[x][y]>target) //当前位置值>target,上移
x--;
else if(array[x][y]<target) //当前位置值<target,右移
y++;
else
return true;
}
return false;
}
};
面试题4:
题目描述:
思路:先计算空格个数,str原长及新长度,然后从后向前拷贝,避免内存覆盖
代码:
//假定length为系统规定字符串输出的最大长度,固定为一个常数
class Solution
{
public:
void replaceSpace(char *str,int length)
{
if(str==NULL||length<)//当str为空或最大长度非法,则返回
{
return;
}
int len=;//str的长度
int blank=;//空格的个数
int i=;
while(str[i]!='\0')
{
if(str[i++]==' ')
blank++;
len++;
}
int newlen=len+*blank;//str替换后新的长度
if(newlen>length)//新长度<系统分配的最大长度时,返回
return; //str的替换过程,从后向前拷贝
while(len>= && newlen>len)
{
if(str[len]!=' ')
str[newlen--]=str[len];
else
{
str[newlen--]='';
str[newlen--]='';
str[newlen--]='%';
}
len--;
}
}
};
面试题5:
题目描述:
思路:递归,直至找到最后一个节点,进行打印。
代码:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(struct ListNode* head)
{
vector<int> tail;
if(head!=NULL)
{
if(head->next!=NULL)
tail=printListFromTailToHead(head->next);
tail.push_back(head->val);
}
return tail;
}
};
面试题6:
题目描述:
思路:前序遍历的第一个节点为根节点root,再根据中序遍历的结果,查找到中序遍历结果中与root值相等的位置index,
则该值左边的为左子树的节点,右边的为右子树的节点。然后以左、右子树为子问题,递归调用函数重建子树。
代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
{
int Size = in.size();//遍历这棵树的节点数
if(Size == ) //树为空
return NULL;
vector<int> preLeft, preRight, inLeft, inRight;
int val = pre[]; //根节点的值(前序遍历的第一个值)
TreeNode* node = new TreeNode(val);//构建根节点
int index = ;
for(index = ; index < Size; ++index)
{
if(in[index] == val) //在前序遍历结果中查找根节点值的位置
break;
}
for(int i = ; i < Size; ++i)
{
if(i < index)//在中序遍历结果中,在根节点前的值均为二叉树的左子树的值
{
//构建左子树
inLeft.push_back(in[i]);
preLeft.push_back(pre[i+]);
}
else if(i > index)
{
//构建右子树
inRight.push_back(in[i]);//Construct the right pre and in preRight.push_back(pre[i]);
}
}
//分为子问题,递归调用
node->left = reConstructBinaryTree(preLeft, inLeft);
node->right = reConstructBinaryTree(preRight, inRight);
return node;
}
};
面试题7:
题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路: 两个栈实现一个队列,记两个栈分别为stack1、stack2。入队列操作,即为入栈stack1操作;
而出队列可先将stack1中的数据全部push到stack2中,两次先进后出,使得stack2中数据顺
序就是队列先进先出的顺序,然后再将stack2的top数据pop即可。
但须注意的是:将stack1中数据push到stack2之前,徐判断stack2是否为空:
1)若为空,则将stack1中数据全部push进来后在pop它的top数据。
2)若stack2中原本就有数据,则需先将stack2中原有的数据先pop

代码:
class Solution
{
public:
void push(int node) //直接将数据入stack1,先进后出一次
{
stack1.push(node);
}
int pop()
{
if(stack2.empty())//若stack2为空,将stack1的数据全push进stack2中,先进后出二次(stcak2中的数据顺序为队列中的数据顺序)
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
int top=stack2.top();//保存stack2的顶部数据
stack2.pop();//将stack2中的顶部元素pop出去
return top;
}
private:
stack<int> stack1;
stack<int> stack2;
};
剑指Offer面试题1的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- tp框架 :操作数据库
操作数据库,进行增删改数据 一.对数据表添加数据(方法:add()) (1)上一篇已经讲过链接数据库了,继续进行对数据库的操作,还是用控制器文件中的HomeController.class文件 看下数 ...
- 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路
1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3 ...
- Spring IOC容器中Bean的生命周期
1.IOC容器中Bean的生命周期 构造器函数 设置属性 初始化函数(在Bean配置中 init-method) 使用Bean 结束时关闭容器(在Bean中配置destroy-method) 2.Be ...
- ionic/cordvoa 修改platform文件夹里的文件,build会覆盖问题
这个问题开始让我感觉很崩溃,然后,我也很意外,如果遇到可以试一试 情景: 编辑platform/android/build.gradle 看了一下cordova 命令,好像还没这个命令,但是我还真的执 ...
- React Native 之 项目实战(一)
前言 本文有配套视频,可以酌情观看. 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我. 文中所有内容仅供学习交流之用,不可用于商业用途,如因此引起的相关法律法规责任,与我无关. 如文中内容对 ...
- Ext JS 6学习文档–第1章–ExtJS入门指南
Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...
- php学习测试题目
<?php header("content-type:text/html;charset=utf-8"); /* 1.银行给客户每天万分之四的利率,本金10 ...
- 【Unity编程】四元数(Quaternion)与欧拉角
版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩 ...
- [SQL] SQL 基础知识梳理(七)- 集合运算
SQL 基础知识梳理(七)- 集合运算 目录 表的加减法 联结(以列为单位) 一.表的加减法 1.集合:记录的集合(表.视图和查询的执行结果). 2.UNION(并集):表的加法 -- DDL:创建表 ...
- 移动端高清、多屏适配方案——rem
背景: 开发移动端H5页面 一套设计图 不同尺寸的手机 不同分辨率的手机 方案:使用rem作为单位解决一套设计图适应不同分辨率,不同尺寸的手机. 概念: REM(font size of the ro ...