剑指offer第三章

1.数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

 class Solution {
public:
bool g_InvalidInput=false;
double Power(double base, int exponent)
{
g_InvalidInput=false;
if(equal(base,0.0)&&exponent<)
{
g_InvalidInput=true;
return 0.0;
}
unsigned int absExponent=(unsigned int)(exponent);
if(exponent<)
absExponent=(unsigned int)(-exponent);
double result=PowerWithUnsignedExponent(base,absExponent);
if(exponent<)
result=1.0/result;
return result;
} double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
double result=1.0;
for(int i=;i<=exponent;++i)
result*=base; return result;
}
bool equal(double num1,double num2)
{
if((num1-num2>-0.0000001)&&(num1-num2<0.0000001))
return true;
else
return false;
}
};

2.调整数组顺序使奇数位于偶数前面,并保持奇数和奇数,偶数和偶数相对位置不变

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 class Solution {
public:
void reOrderArray(vector<int> &array)
{
vector<int> res;
for(int i = ; i < array.size(); i++)
{
if(array[i] % == )
res.push_back(array[i]);
}
for(int i = ; i < array.size(); i++)
{
if(array[i] % == )
res.push_back(array[i]);
}
//array.swap(res);
array = res;
}
};

3.输入一个链表,输出该链表中倒数第k个结点

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if(pListHead==NULL||k==)
return NULL;
ListNode *pAhead=pListHead;
ListNode *pBhind=NULL;
for(unsigned int i=;i<k-;++i)
{
if(pAhead->next!=NULL)
pAhead=pAhead->next;
else
return NULL;
}
pBhind=pListHead; while(pAhead->next!=NULL)
{
pAhead=pAhead->next;
pBhind=pBhind->next;
}
return pBhind;
}
};

4.输入一个链表,反转链表后,输出链表的所有元素。

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* ReverseList(ListNode* pHead)
{
ListNode* pReversedHead=NULL;
ListNode* pNode=pHead;
ListNode* pPrev=NULL;
while(pNode!=NULL)
{
ListNode* pNext=pNode->next;
if(pNext==NULL)
pReversedHead=pNode;
pNode->next=pPrev;
pPrev=pNode;
pNode=pNext;
}
return pReversedHead;
}
};

5.合并两个排序的链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL) //链表1为空,直接返回链表2
return pHead2;
else if(pHead2==NULL)//链表2为空,直接返回链表1
return pHead1;
ListNode* pMergedHead=NULL;
if(pHead1->val<pHead2->val)
{
pMergedHead=pHead1;
pMergedHead->next=Merge(pHead1->next,pHead2);//递归
}
else
{
pMergedHead=pHead2;
pMergedHead->next=Merge(pHead1,pHead2->next);//递归
}
return pMergedHead;
}
};

6.树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

 /*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool result=false;
//递归在A中查找与B根结点相同的结点
if(pRoot1!=NULL&&pRoot2!=NULL)//树A和树B不为空
{
if(pRoot1->val==pRoot2->val)//找到相等的结点,执行第二步
result=DoesTree1HaveTree2(pRoot1,pRoot2);
if(!result)
{
result=HasSubtree(pRoot1->left,pRoot2);//找左结点
}
if(!result)
{
result=HasSubtree(pRoot1->right,pRoot2);//找右结点
}
}
return result;
}
bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot2==NULL)//树B找到叶结点的左右,则返回真
return true;
if(pRoot1==NULL)//树A找到叶结点的左右,返回假
return false;
if(pRoot1->val!=pRoot2->val)//不等,返回假
return false;
//相等,递归判断左右结点是否相等
return DoesTree1HaveTree2(pRoot1->left,pRoot2->left)&&DoesTree1HaveTree2(pRoot1->right,pRoot2->right);
}
};

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

  1. 剑指offer—第三章高质量的代码(按顺序打印从1到n位十进制数)

    题目:输入一个数字n,按照顺序打印出1到最大n位十进制数,比如输入3,则打印出1,2,3直到最大的3位数999为止. 本题陷阱:没有考虑到大数的问题. 本题解题思路:将要打印的数字,看成字符串,不足位 ...

  2. 剑指offer—第三章高质量代码(数值的整数次方)

    高质量的代码:容错处理能力,规范性,完整性.尽量展示代码的可扩展型和可维护性. 容错处理能力:特别的输入和处理,异常,资源回收. 规范性:清晰的书写,清晰的布局,合理的命名. 完整性:功能测试,边界测 ...

  3. 剑指offer—第三章高质量代码(o(1)时间删除链表节点)

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue ...

  4. 剑指offer—第三章高质量代码(合并两个排序链表)

    题目:输入员两个递增排序的链表,合并这两个链表并使新的链表中的结点仍然是按照递增排序的. 思路:首先,定义两个头节点分别为Head1和Head2的链表,然后比较第一个节点的值,如果是Head1-> ...

  5. 剑指offer第七章&第八章

    剑指offer第七章&第八章 1.把字符串转换成整数 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串 ...

  6. 剑指offer第六章

    剑指offer第六章 1.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,所以输出4 分析:思路1 ...

  7. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

  8. 剑指offer第四章

    剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...

  9. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

随机推荐

  1. shell脚本中case select 的使用

    #!/bin/bash # case echo "1.Install PHP" echo "2.Install Mysql" echo "3.Inst ...

  2. 【Python】更优的字符串格式化方式 -- "format"替代"%s"

    背景 前段时间看了一篇介绍Python的代码技巧的文章,建议格式化字符串时使用"format"代替使用"%",但是没有说明原因.各博客网站介绍相关用法的博客很多 ...

  3. python 中str format 格式化数字补0方法

      >>> "{0:03d}".format(1)'001'>>> "{0:03d}".format(10)'010'> ...

  4. Lua学习笔记1,基本数据类型

    1.字符串的连接使用的是  .. ,如 print(123 .. 44) 输出 12344 print ('a' .. 'b') 输出 ab print(123 .. 44)这句的时候 .. 两边要空 ...

  5. 三十一 Python分布式爬虫打造搜索引擎Scrapy精讲—chrome谷歌浏览器无界面运行、scrapy-splash、splinter

    1.chrome谷歌浏览器无界面运行 chrome谷歌浏览器无界面运行,主要运行在Linux系统,windows系统下不支持 chrome谷歌浏览器无界面运行需要一个模块,pyvirtualdispl ...

  6. 二十六 Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理

    downloadmiddleware介绍中间件是一个框架,可以连接到请求/响应处理中.这是一种很轻的.低层次的系统,可以改变Scrapy的请求和回应.也就是在Requests请求和Response响应 ...

  7. opencv画图

    #coding=utf-8 import cv2 import numpy as np img = cv2.imread("2.png",cv2.IMREAD_COLOR) cv2 ...

  8. php上传文件出现500错误

    问题: 能上传小于10k的文件,上传大于10k的文件就会报500错误 解决办法: 首先查看错误日志,看看报错是什么 其次查看client_body_temp的权限问题 关于client_body_te ...

  9. 11g OCM自动打补丁

    1.先替换掉OPatch软件 每个实例都要运行 GRID_HOME和ORACLE_HOME的OPatch目录都去除掉 把OPatch软件p6880880_112000_Linux-x86-64.zip ...

  10. Chunky Monkey

    猴子吃香蕉可是掰成好几段来吃哦! 把一个数组arr按照指定的数组大小size分割成若干个数组块. 例如:chunk([1,2,3,4],2)=[[1,2],[3,4]]; chunk([1,2,3,4 ...