剑指offer第三章

1.数值的整数次方

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

  1. class Solution {
  2. public:
  3. bool g_InvalidInput=false;
  4. double Power(double base, int exponent)
  5. {
  6. g_InvalidInput=false;
  7. if(equal(base,0.0)&&exponent<)
  8. {
  9. g_InvalidInput=true;
  10. return 0.0;
  11. }
  12. unsigned int absExponent=(unsigned int)(exponent);
  13. if(exponent<)
  14. absExponent=(unsigned int)(-exponent);
  15. double result=PowerWithUnsignedExponent(base,absExponent);
  16. if(exponent<)
  17. result=1.0/result;
  18. return result;
  19. }
  20.  
  21. double PowerWithUnsignedExponent(double base,unsigned int exponent)
  22. {
  23. double result=1.0;
  24. for(int i=;i<=exponent;++i)
  25. result*=base;
  26.  
  27. return result;
  28. }
  29. bool equal(double num1,double num2)
  30. {
  31. if((num1-num2>-0.0000001)&&(num1-num2<0.0000001))
  32. return true;
  33. else
  34. return false;
  35. }
  36. };

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

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
  1. class Solution {
  2. public:
  3. void reOrderArray(vector<int> &array)
  4. {
  5. vector<int> res;
  6. for(int i = ; i < array.size(); i++)
  7. {
  8. if(array[i] % == )
  9. res.push_back(array[i]);
  10. }
  11. for(int i = ; i < array.size(); i++)
  12. {
  13. if(array[i] % == )
  14. res.push_back(array[i]);
  15. }
  16. //array.swap(res);
  17. array = res;
  18. }
  19. };

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

  1. /*
  2. struct ListNode {
  3. int val;
  4. struct ListNode *next;
  5. ListNode(int x) :
  6. val(x), next(NULL) {
  7. }
  8. };*/
  9. class Solution {
  10. public:
  11. ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
  12. {
  13. if(pListHead==NULL||k==)
  14. return NULL;
  15. ListNode *pAhead=pListHead;
  16. ListNode *pBhind=NULL;
  17. for(unsigned int i=;i<k-;++i)
  18. {
  19. if(pAhead->next!=NULL)
  20. pAhead=pAhead->next;
  21. else
  22. return NULL;
  23. }
  24. pBhind=pListHead;
  25.  
  26. while(pAhead->next!=NULL)
  27. {
  28. pAhead=pAhead->next;
  29. pBhind=pBhind->next;
  30. }
  31. return pBhind;
  32. }
  33. };

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

  1. /*
  2. struct ListNode {
  3. int val;
  4. struct ListNode *next;
  5. ListNode(int x) :
  6. val(x), next(NULL) {
  7. }
  8. };*/
  9. class Solution {
  10. public:
  11. ListNode* ReverseList(ListNode* pHead)
  12. {
  13. ListNode* pReversedHead=NULL;
  14. ListNode* pNode=pHead;
  15. ListNode* pPrev=NULL;
  16. while(pNode!=NULL)
  17. {
  18. ListNode* pNext=pNode->next;
  19. if(pNext==NULL)
  20. pReversedHead=pNode;
  21. pNode->next=pPrev;
  22. pPrev=pNode;
  23. pNode=pNext;
  24. }
  25. return pReversedHead;
  26. }
  27. };

5.合并两个排序的链表

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

  1. /*
  2. struct ListNode {
  3. int val;
  4. struct ListNode *next;
  5. ListNode(int x) :
  6. val(x), next(NULL) {
  7. }
  8. };*/
  9. class Solution {
  10. public:
  11. ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
  12. {
  13. if(pHead1==NULL) //链表1为空,直接返回链表2
  14. return pHead2;
  15. else if(pHead2==NULL)//链表2为空,直接返回链表1
  16. return pHead1;
  17. ListNode* pMergedHead=NULL;
  18. if(pHead1->val<pHead2->val)
  19. {
  20. pMergedHead=pHead1;
  21. pMergedHead->next=Merge(pHead1->next,pHead2);//递归
  22. }
  23. else
  24. {
  25. pMergedHead=pHead2;
  26. pMergedHead->next=Merge(pHead1,pHead2->next);//递归
  27. }
  28. return pMergedHead;
  29. }
  30. };

6.树的子结构

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

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };*/
  10. class Solution {
  11. public:
  12. bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
  13. {
  14. bool result=false;
  15. //递归在A中查找与B根结点相同的结点
  16. if(pRoot1!=NULL&&pRoot2!=NULL)//树A和树B不为空
  17. {
  18. if(pRoot1->val==pRoot2->val)//找到相等的结点,执行第二步
  19. result=DoesTree1HaveTree2(pRoot1,pRoot2);
  20. if(!result)
  21. {
  22. result=HasSubtree(pRoot1->left,pRoot2);//找左结点
  23. }
  24. if(!result)
  25. {
  26. result=HasSubtree(pRoot1->right,pRoot2);//找右结点
  27. }
  28. }
  29. return result;
  30. }
  31. bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2)
  32. {
  33. if(pRoot2==NULL)//树B找到叶结点的左右,则返回真
  34. return true;
  35. if(pRoot1==NULL)//树A找到叶结点的左右,返回假
  36. return false;
  37. if(pRoot1->val!=pRoot2->val)//不等,返回假
  38. return false;
  39. //相等,递归判断左右结点是否相等
  40. return DoesTree1HaveTree2(pRoot1->left,pRoot2->left)&&DoesTree1HaveTree2(pRoot1->right,pRoot2->right);
  41. }
  42. };

剑指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. maven笔记(1)

    maven环境搭建:http://www.cnblogs.com/fnng/archive/2011/12/02/2272610.html 项目管理利器(Maven)——常用的构建命令1. mvn - ...

  2. Java之聊天室系统设计一

    任务: 先上实现效果图: 登陆界面: index.jsp: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  3. 我的Android学习路线(二)

    这两天的主要工作: 优化了一下布局界面,原本使用的是相对布局,直观省力,但是考虑了一下还是使用更加主流的线性布局. 完善了一下计算器的功能,比如加入小数运算. 使用线性布局的思路可以用下面的伪代码表示 ...

  4. Learning R笔记(一)

    基本操作 帮助文档:?函数.演示:demo(函数).参数列表:formals(函数),返回为成对列表pairlist. 用all.equal函数检查浮点数是否相等,容忍度默认为1.5e-8,如果相等返 ...

  5. HDU5137-最短路-删点

    How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/5 ...

  6. SPOJ KPSUM ★(数位DP)

    题意 将1~N(1<=N<=10^15)写在纸上,然后在相邻的数字间交替插入+和-,求最后的结果.例如当N为12时,答案为:+1-2+3-4+5-6+7-8+9-1+0-1+1-1+2=5 ...

  7. 二十二、utl_inaddr(用于取得局域网或Internet环境中的主机名和IP地址)

    1.概述 作用:用于取得局域网或Internet环境中的主机名和IP地址. 2.包的组成 1).get_host_name作用:用于取得指定IP地址所对应的主机名语法:utl_inaddr.get_h ...

  8. Redis--初入

    安装 .下载源码,解压缩后编译源码  $ wget http://download.redis.io/releases/redis-4.0.1.tar.gz $ tar xzf redis-4.0.1 ...

  9. Python之Fabric

    [Fabric] Fabric是一个用Python开发的部署工具,最大特点是不用登录远程服务器,在本地运行远程命令,几行Python脚本就可以轻松部署. 安装 wget https://bootstr ...

  10. python获取文件路径, 文件名, 后缀名

    def get_filePath_fileName_fileExt(fileUrl): """ 获取文件路径, 文件名, 后缀名 :param fileUrl: :ret ...