zoukankan      html  css  js  c++  java
  • 剑指offer第三章

    剑指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<0)
     8         {
     9             g_InvalidInput=true;
    10             return 0.0;
    11         }
    12         unsigned int absExponent=(unsigned int)(exponent);
    13         if(exponent<0)
    14             absExponent=(unsigned int)(-exponent);
    15         double result=PowerWithUnsignedExponent(base,absExponent);
    16         if(exponent<0)
    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=1;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 = 0; i < array.size(); i++)
     7         {
     8             if(array[i] % 2 == 1)
     9                 res.push_back(array[i]);
    10         }
    11         for(int i = 0; i < array.size(); i++)
    12         {
    13             if(array[i] % 2 == 0)
    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==0)
    14             return NULL;
    15         ListNode *pAhead=pListHead;
    16         ListNode *pBhind=NULL;
    17         for(unsigned int i=0;i<k-1;++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 };
  • 相关阅读:
    Codeforces Round #425 (Div. 2) Problem A Sasha and Sticks (Codeforces 832A)
    bzoj 2301 Problem b
    bzoj 1101 [POI2007]Zap
    bzoj 2005 能量采集
    bzoj 2527 Meteors
    bzoj 2724 [Violet 6]蒲公英
    回顾树状数组
    bzoj 3237 连通图
    bzoj 2733 永无乡
    Codeforces 817C Really Big Numbers
  • 原文地址:https://www.cnblogs.com/lxt1105/p/7411755.html
Copyright © 2011-2022 走看看