剑指offer第二章

1.二维数组中的查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

 class Solution {
public:
bool Find(int target, vector<vector<int> > array)
{
/*二维数组的行数和列数*/
int rows = array.size();
int columns = array[].size(); int row;
int column;
for (row = rows - , column = ; row >= && column<columns;)
{
if (target == array[row][column])
return true;
if (target<array[row][column])
{
row--;
continue;
}
if (target>array[row][column])
{
column++;
continue;
}
}
return false;
}
};

2.替换空格

请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

 class Solution {
public:
void replaceSpace(char *str,int length)
{
if(str==NULL||length<)
{
return;
}
int originalLength=;
int numberOfBlank=;
int i=;
while(str[i]!='\0')//计算原始字符串长度和空格数目
{
++originalLength;
if(str[i]==' ')
{
++numberOfBlank;
}
++i;
}
int newLength=originalLength+numberOfBlank*;//替换之后新的长度
if(newLength>length)
//溢出、越界
return;
int indexOfOriginal=originalLength;
int indexOfNew=newLength;
while(indexOfOriginal>=&&indexOfNew>indexOfOriginal)
{
if(str[indexOfOriginal]==' ')//找到空格,依次插入‘0’‘2’‘%’
{
str[indexOfNew--]='';
str[indexOfNew--]='';
str[indexOfNew--]='%';
}
else
{
str[indexOfNew--]=str[indexOfOriginal];
}
--indexOfOriginal;
}
}
};

3.从尾到头打印链表

输入一个链表,从尾到头打印链表每个节点的值。

 //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> result;
struct ListNode* pNode=head;
while(pNode!=NULL){
result.push_back(pNode->val);
pNode=pNode->next;
}
reverse(result.begin(),result.end());//applying reverse()
return result;
}
};

4.重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

 /**
* 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)
{
//判定递归终止条件;
if(pre.size() == || in.size() == )
{
return NULL;
}
//定义Node节点并其求根节点;
int root = pre[];
TreeNode* node = new TreeNode(root);
vector<int>::iterator it;
//1.求左右子树的遍历序列;
vector<int> preLeft, preRight, inLeft, inRight;
//(1).求根节点在中序遍历序列中的位置;
vector<int>::iterator i;
for(it = in.begin(); it != in.end(); it++)
{
if(root == *it)
{
i = it;
}
}
//(2).求左右子树的中序遍历子序列;
int k = ;
for(it = in.begin(); it != in.end(); it++)
{
if(k == )
{
inLeft.push_back(*it);
}
else if(k == )
{
inRight.push_back(*it);
}
else {}
if(it == i)
{
k = ;
}
}
//(3).求左右子树的前序遍历子序列;
k = ;
vector<int>::iterator ite;
for(it = pre.begin()+; it != pre.end(); it++)
{
for(ite = inLeft.begin(); ite != inLeft.end(); ite++)
{
if(*it == *ite)
{
preLeft.push_back(*it);
k = ;
}
}
if(k == )
{
preRight.push_back(*it);
}
k = ;
}
//根据遍历序列求出跟的左右节点;
node->left = reConstructBinaryTree(preLeft,inLeft);
node->right = reConstructBinaryTree(preRight,inRight);
//返回节点地址;
return node;
}
};

5.用两个栈实现队列

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

<分析>: 
入队:将元素进栈A 
出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈; 
 如果不为空,栈B直接出栈。
 class Solution
{
public:
void push(int node)
{
stack1.push(node);
}
int pop()
{
int a;
if(stack2.empty())
{
while(!stack1.empty())
{
a=stack1.top();
stack2.push(a);
stack1.pop();
}
}
a=stack2.top();
stack2.pop();
return a;
}
private:
stack<int> stack1;
stack<int> stack2;
};

6.旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
 class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
//数组为空时
if(rotateArray.size() == )
return -;
//前部分数据旋转
for(int i = ; i < rotateArray.size() - ; i++)
{
if (rotateArray[i] > rotateArray[i + ])
return rotateArray[i + ];
}
//全部数据旋转,相当于没有旋转,最小数即为第一个数
return rotateArray[];
}
};

7.菲波那切数列

大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39

 class Solution {
public:
int Fibonacci(int n)
{
int result[]={,};
if(n<)
return result[n];
long long f1=;
long long f2=;
long long fn=;
for(int i=;i<=n;i++)
{
fn=f1+f2;
f2=f1;
f1=fn;
}
return fn;
}
};

8.二进制中”1“的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
解法1:首先把n和1做与运算,判断n的最低位是不是为1
            接着把1左移一位得到2,在与n做与运算,就能判断n的次低位是不是1
            ......这样反复左移,每次都能判断n的其中一位是不是1。
            循环的次数等于整数二进制的位数
解法2:首先把一个整数减去1,再和原整数做与运算,会把最右边一个1变成0.
            那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作
            循环的次数等于整数中1的个数
 class Solution {
public:
int NumberOf1(int n)
{
int count=;//统计的值初始化
unsigned int flag=;//设置一个标志,作为循环结束的终止条件
while(flag)
{
//首先把n和1做与运算,判断n的最低位是不是为1
//接着把1左移一位得到2,在与n做与运算,就能判断n的次低位是不是1
//......这样反复左移,每次都能判断n的其中一位是不是1。
// 循环的次数等于整数二进制的位数
if(n&flag)
count++;
flag=flag<<;
}
return count;
}
};

剑指offer第二章的更多相关文章

  1. 剑指offer—第二章算法之二分查找(旋转数组的最小值)

    旋转数组的最小数字 题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如:数组{3,4,5,1,2}为{1,2,3,4, ...

  2. 剑指offer—第二章算法之快速排序

    算法:排序和查找(二分查找,归并排序,快速排序),位运算等. 查找:顺序查找,哈希查找,二叉排序树查找,哈希表. 二分查找可以解决:"旋转数组中的最小数字","数字在排序 ...

  3. 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树

    一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...

  4. 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)

    一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...

  5. 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表

    具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...

  6. 《剑指offer 第二版》题解

    剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...

  7. 《剑指offer(第二版)》面试题60——n个骰子的点数

    一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...

  8. 《剑指offer(第二版)》面试题64——求1+2+...+n

    一.题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句 (即三元运算符,A? B : C) 二.题解 虽然求和问 ...

  9. 结合《剑指offer(第二版)》面试题51来谈谈归并排序

    一.题目大意 给定一个数组A,对于数组A中的两个数字,如果排在前面的一个数字大于(必须大于,等于不算)后面的数字,则这两个数字组成一个逆序对.要求输出数组A中的逆序对的总数.例如,对于数组{7,5,6 ...

随机推荐

  1. response.getWriter().write("中文");乱码问题

    起初遇到这个问题,网上几乎所有的建议都是: response.setHeader("Content-type", "text/html;charset=UTF-8&quo ...

  2. 正确的使用pod install 和 pod update

    pod install 在项目中第一次使用CocoaPods, 进行安装的时候使用这个命令. 在Podfile中增加或删除某个pod后, 也是使用这个命令. 而不是pod update. 每次运行po ...

  3. php温习-变量,常量

    1.变量 内存中用于临时存储数据的一个空间,空间有一个名字子,变量都是以$开头 预定义变量:  $_GET  $_POST  $_REQUEST   $_SEVER  $_SEESION  $_COO ...

  4. Linux shell常用命令

    1. sz 和 rz  sz命令发送文件到本地: # sz filename rz命令本地上传文件到服务器: # rz 执行该命令后,在弹出框中选择要上传的文件即可.

  5. Gruntjs提高生产力(三)

    以下例子来自真实项目,有所删减 grunt-test project 目录结构如下 一我的目的: 1.在src-dev目录中开发最终产出于src目录 2.src-dev中的index目录相当于一个wi ...

  6. 执行Maven install或Maven test命令时控制台输出乱码的解决办法

    [解决方案一] 在Maven的pom.xml文件中增加如下代码: <properties> <argLine>-Dfile.encoding=UTF-8</argLine ...

  7. STL学习笔记(转,还是比较全的)

    STL简介 1 概况 2 1.1 STL是什么 2 1.2 为什么我们需要学习STL 2 1.3 初识STL 2 1.4 STL 的组成 5 2 容器 6 2.1 基本容器——向量(vector) 6 ...

  8. charles抓包unknow

    如果能抓到包,可是解析不出请求,那一定是证书问题,注意以下几点: 1.设备安装证书,注意要抓包的每一个设备都要安装证书,每一个设备! 2.pc端也要安装证书 如果以上两点都做到一定可以解析https请 ...

  9. Python程序员不完全指南

    Python 基础 Python基础 基础数据类型 深浅copy 文件操作 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 各种推导式 递归函数 内置函数和匿名函数 异常处理 常用模块 模块和包 ...

  10. (转)JAVA正则表达式语法大全

    [正则表达式]文本框输入内容控制 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 只能输入数字:"^[0-9]*$". 只能输入n位的数字:"^\d{n ...