《学习笔记一阶段 Day--04》方向2学习 2021-06-08

阔别多日俗事缠身,朋友已经出院。回了趟老家,家里电脑又不适合编程,拖了好久。

所以下文为这段时间不能上网时看书的笔记

方向2学习:学习剑指Offer

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

解题思路:首先排除遍历查找(没有充分利用已知条件)。已知上下左右已经做好排序。效果是什么呢,比一排最后一个数大则本排不用遍历下移一排,比一排第一个数小本排也不用遍历上移一排。比一列第一个数小则向前进一列,比一列最后一个数大则右移一列。是不是开始有思路了,为了理清思路,自己画个例子:架设在此二位数组里查找某个数值

{1,3,5,   16,  29

    2,4,17,  19, 31

    8, 10,21,32,45

    14,16,35,41,46}

可以看出上述总结的规律是可以从左下角或者右上角向对角线方向对别,即有两种方向的对比方式,原理是一样的。

bool Find(int * matrix,int row,int column,int num)
{
    bool found=false;
    if(matrix!=nullptr&&(row*column)>0)
    {
        int i=0,j=column-1;
        while(i<row&&j>=0)
        {
            if(matrix[i*column+j]==num)
            {
                fround=true;
                return fround;
            }
            else if(matrix[i*column+j]>num)
            {
                j--;
            }
            i++;
        }
    }
    return fround;
}

面试题5与起那么例题一样跳过

面试题6:从尾到头打印链表。

思路:两种方式,循环或者递归,各有好处。递归代码简洁,可以直接从尾到头但是占用空间时间,但是不适合层次过深的操作,循环则需要获取边界值,复杂度为O(2n)。

struct List
{
    int data;
    List*list_next;
}
void PrintList(List*list)
{
    vector<int> myvector;
    List*tem=list;
    while( tem!= nullptr)
    {
        myvector.push_back(tem.data);
        tem=tem.list_next;
    }
    vector<int>::iterator it;
    for(it = myvector.rbegin(); it != myvector.end(); it++)
        cout<<*it<<" ";
    return 0;

}

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

解题思路:前序即为中左右,首元素必定为根。在中序中找到根元素,根据中序顺序左中右,得出根元素左侧最近的元素必定为左子树最右值,根元素右侧最近元素必定为右子树最左值。

得出根:1;左子树最右值:2;右子树最左值:5。//根在中序中大于零小于元素个数时有左右子树。

继续下推,当有左子树时前序中下一个元素为左子树根.2为根且为树中最右值,得出

第二层左子树根:2; 左子树最右值:7;没有右子树。

继续重复上面对比得出:4为左子树根,7为4的右子树,至此元素个数少于2,1左侧子树画完,同样方法画右子树。代码如下:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int len=vin.size();
        if (len==0)
            return NULL;
        vector<int> left_pre,right_pre,left_vin,right_vin;
        TreeNode* head = new TreeNode(pre[0]);
        int gen = 0;
        for(int i=0;i<len;i++)
        {
            if(vin[i]==pre[0])               //找出根节点
            {
                gen = i;
                break;
            }
        }
        for(int i=0;i<gen;i++)               //制作左子树
        {
            left_pre.push_back(pre[i+1]);
            left_vin.push_back(vin[i]);
        }
        for(int i=gen+1;i<len;i++)           //制作右子树
        {
            right_pre.push_back(pre[i]);
            right_vin.push_back(vin[i]);
        }
        head->left = reConstructBinaryTree(left_pre,left_vin);   
        head->right = reConstructBinaryTree(right_pre,right_vin);
        return head;
    }
};
————————————————
版权声明:本文为CSDN博主「宁静深远」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012477435/article/details/83351659

 

 

今天就到这了,鼠标键盘都是十年前没用了的,完全用不了。等新的鼠标到了再补吧。

一支穿云箭千军万马来相见,留一个问题,请广大网友帮忙看看,新装的vs2019提取安装文件失败,改了dns仍然没用,怎么解决。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值