剑指offer

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

 1 class Solution {
 2 public:
 3     bool Find(int target, vector<vector<int> > array) {
 4  
 5         int row = (int)array.size();
 6         int col = (int)array[0].size();
 7         if (row == 0 || col == 0)
 8             return false;
 9         if (target < array[0][0] || target > array[row - 1][col - 1])
10             return false;
11         int i = row - 1;
12         int j = 0;
13         while (i >=0 && j <col)
14         {
15             if (array[i][j] > target)
16             {
17                 i--;
18             }
19             else if (array[i][j] < target)
20             {
21                 j++;
22             }
23  
24             else
25             
26                 return true;
27             
28         }
29          return false;
30     }
31 };

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

 1 class Solution {
 2 
 3 public:
 4     void replaceSpace(char *str,int length) {
 5         int i=length-1,j,count=0;
 6         while(i>=0){
 7             if(str[i]==' '){
 8                 for(j=length;j>=i;j--){
 9                     str[j+2]=str[j];
10                 }
11                 str[i]='%';
12                 str[i+1]='2';
13                 str[i+2]='0';
14                 length+=2;
15             }
16              i--;
17         }
18     }
19 
20     
21 };

3、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

 1 class Solution {
 2 public:
 3     vector<int> printListFromTailToHead(ListNode* head) {
 4            vector <int>  result;
 5       stack<int> arr;
 6       ListNode* p=head;
 7       while(p!=NULL)
 8       {
 9        arr.push(p->val);
10        p=p->next;
11       }
12      int len=arr.size();
13      for(int i=0;i<len;i++)
14       {
15        result.push_back(arr.top());   
16        arr.pop();
17      }
18            return  result;
19         
20         
21     }
22 };

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

 1 class Solution {
 2 public:
 3     TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
 4        int s = vin.size();
 5         if(s==0)
 6             return NULL;
 7         vector<int> pre_left,pre_right,vin_left,vin_right;
 8         TreeNode* node = new TreeNode(pre[0]);
 9         int index = 0;
10         for(int i=0;i<s;i++){
11             if(vin[i]==pre[0]){
12                 index = i;
13                 break;
14             }
15          }
16        for(int i=0;i<index;i++){
17             pre_left.push_back(pre[i+1]);
18             vin_left.push_back(vin[i]);
19         }
20         for(int i=0;i<s-index-1;i++){
21             pre_right.push_back(pre[i+index+1]);
22             vin_right.push_back(vin[i+index+1]);
23         }
24         
25  
26 /**for(int i = 0; i < s; ++i){          
27     if(i < index){              
28         vin_left.push_back(vin[i]);//Construct the left pre and in       
29         pre_left.push_back(pre[i+1]);    
30     }            
31     else if(i > index){            
32         vin_right.push_back(vin[i]);//Construct the right pre and in           
33         pre_right.push_back(pre[i]);           
34     }       
35 }*/
36         node->left = reConstructBinaryTree(pre_left,vin_left);
37         node->right = reConstructBinaryTree(pre_right,vin_right);
38         return node;
39 
40     }
41 };

 

posted @ 2019-04-07 15:31  晴天麦芽糖  阅读(167)  评论(0编辑  收藏  举报