zoukankan      html  css  js  c++  java
  • 剑指Offer——03天

    调整数组的位置时奇数放在偶数前

    • 模拟一下就好了
    class Solution {
    public:
        void reOrderArray(vector<int> &array) {
            vector <int> a,b;
            for(int i=0;i<array.size();i++)
            {
                if(array[i]%2==1) a.push_back(array[i]);
                else b.push_back(array[i]);
            }
            array.clear();
            for(int i=0;i<a.size();i++)
            {
                array.push_back(a[i]);
            }
            for(int i=0;i<b.size();i++)
            {
                array.push_back(b[i]);
            }
        }
    };

    链表中倒数第k个结点

    • 跑一遍链表有多少个结点,然后输出第n-k+1个结点就是倒数第k个结点
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
            unsigned int num=0;
            ListNode *p = pListHead;
            while(p!=NULL)
            {
                num++;
                p=p->next;
            }
            p = pListHead;
            unsigned int i=0;
            while(p!=NULL)
            {
                if(i+k==num) return p;
                i++;
                p=p->next;
            }
            return p;
        }
    };

    反转链表

    • 采用头插法即可
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* ReverseList(ListNode* pHead) {
            ListNode * p = (ListNode*) malloc(sizeof(ListNode));
            p->next = NULL;
            while(pHead!=NULL)
            {
                ListNode * k = (ListNode*) malloc(sizeof(ListNode));
                k->val = pHead->val;
                k->next = p->next;
                p->next = k;
                pHead = pHead->next;
            }
            return p->next;
        }
    };

    合并两个排序的链表

    • 平时写代码不严谨的锅,没有考虑两个链表可能为空的情况,导致一直提示段溢出,差点怀疑人生,整整搁置数天才AC了,AC的代码写得也很不好,过几天再得重新写一下
    /*
    struct ListNode {
        int val;
        struct ListNode *next;
        ListNode(int x) :
                val(x), next(NULL) {
        }
    };*/
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            if(pHead1==NULL&&pHead2!=NULL) return pHead2;
            else if(pHead1!=NULL&&pHead2==NULL) return pHead1;
            else if(pHead1==NULL&&pHead2==NULL) return NULL;
            int num;
            if(pHead1->val<pHead2->val)
            {
                num = pHead1->val;
                pHead1 = pHead1->next;
            }
            else
            {
                 num = pHead2->val;
                 pHead2 = pHead2->next;
            }
            ListNode * head = new ListNode(num);
            ListNode *p = head;
            while(pHead1!=NULL&&pHead2!=NULL)
            {
                if(pHead1->val<pHead2->val)
                {
                    num = pHead1->val;
                    pHead1 = pHead1->next;
                }
                else
                {
                    num = pHead2->val;
                    pHead2 = pHead2->next;
                }
                ListNode * k = new ListNode(num);
                p->next = k;
                p = p->next;
            }
            if(pHead1!=NULL)
            {
                p->next = pHead1;
            }
            if(pHead2!=NULL)
            {
                p->next = pHead2;
            }
            return head;
        }
    };

    树的子结构

    • 利用队列层次遍历所有树结点,再利用递归判断是否为子结构
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool judge(TreeNode* node1,TreeNode* node2)
        {
            if(node1==NULL&&node2!=NULL) return false;
            else if(node1!=NULL&&node2==NULL) return true;
            else if(node1==NULL&&node2==NULL) return true;
            else 
            {
                if(node1->val!=node2->val) return false;
                else 
                    return judge(node1->left,node2->left)&&judge(node1->right,node2->right);
            }
        }
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if(pRoot1==NULL) return false;
            if(pRoot2==NULL) return false;
            queue <TreeNode*> q;
            q.push(pRoot1);
            while(!q.empty())
            {
                TreeNode * k = q.front();
                q.pop();
                if(judge(k,pRoot2)==true) return true;
                if(k->left!=NULL) q.push(k->left);
                if(k->right!=NULL) q.push(k->right);
            }
            return false;
        }
    };

    二叉树的镜像

    • 利用自上而下调用递归,先将当前结点的两个子树交换,在分别对这两个子树的左右子树进行交换
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        void Mirror(TreeNode *pRoot) {
            if(pRoot!=NULL)
            {
                TreeNode * l = pRoot->left;
                TreeNode * r = pRoot->right;
                pRoot->left = r;
                pRoot->right = l;
                Mirror(l);
                Mirror(r);
            }
        }
    };
  • 相关阅读:
    Acwing199 余数之和
    试题 算法提高 WYF的交易地点(简单计算几何)
    试题 算法提高 八数码(bfs)
    试题 算法提高 合唱队形(dp)
    牛客练习 牛牛的mex(维护前缀后缀最小值)
    牛客练习 牛牛的算术(数学、规律)
    试题 算法提高 树的直径(dfs)
    高精度乘法(板子)
    试题 算法提高 不重叠的线段(dp)
    拜托了,牛老师(dfs)
  • 原文地址:https://www.cnblogs.com/simplekinght/p/8652044.html
Copyright © 2011-2022 走看看