剑指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 };