zoukankan      html  css  js  c++  java
  • 《剑指offer》Q13-18 (牛客10.13)

    Q13 调整数组顺序使奇数位于偶数前

    输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    方法1:新开数组,先添加奇数,再添加偶数。代码略。

    方法2:

    /**
     * 1.要想保证原有次序,则只能顺次移动或相邻交换。
     * 2.i从左向右遍历,找到第一个偶数。
     * 3.j从i+1开始向后找,直到找到第一个奇数。
     * 4.将[i,...,j-1]的元素整体后移一位,最后将找到的奇数放入i位置,然后i++。
     * 5.終止條件:j向後遍歷查找失敗。
     */
    public void reOrderArray2(int [] a) {
        if(a==null||a.length==0)
            return;
        int i = 0,j;
        while(i<a.length){
            while(i<a.length&&!isEven(a[i]))
                i++;
            j = i+1;
            while(j<a.length&&isEven(a[j]))
                j++;
            if(j<a.length){
                int tmp = a[j];
                for (int j2 = j-1; j2 >=i; j2--) {
                    a[j2+1] = a[j2];
                }
                a[i++] = tmp;
            }else{// 查找失敗
                break;
            }
        }
    }
    boolean isEven(int n){
        if(n%2==0)
            return true;
        return false;
    }
    

    Q14 链表中倒数第k个结点

    输入一个链表,输出该链表中倒数第k个结点。

    这道题去南大面试还被问了,两个指针的思路不错,但是涉及指针的细节很多,容易写崩。。。

    /*
    	首先要判断指针是否为空,以及k是否大于0!!
    	然后p1移到最后一个为止,不能指到空
    */
    class Solution {
    public:
        ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
            if(pListHead == NULL || k==0)
                return NULL;
             
            ListNode* p1=pListHead;
            ListNode* p2=pListHead;
            
            for(int i=1;i<k;i++){
                if(p1->next==NULL){
                    return NULL;
                }
                p1=p1->next;
            }
             
            while(p1->next != NULL){
                p1=p1->next;
                p2=p2->next;
            }
             
            return p2;
        }
    };
    

    Q15 反转链表

    用头插法新建了一个链表。当然不新开链表是可以的,似乎正解也是这样。。然后递归也可以但没必要。

    Q16 合并两个有序链表

    输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

    /*
    A:	考归并操作。
    T:	要时刻记得指针所指的结点,不要漏掉!
    */
    class Solution {
    public:
        ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
        {
            ListNode *newList = new ListNode(0);
            ListNode *p1 = pHead1, *p2 = pHead2, *p3 = newList;
            
            while(p1 && p2){
                if(p1->val <= p2 -> val){
                    p3->next = p1;
                    p1 = p1->next;
                }else{
                    p3->next = p2;
                    p2 = p2->next;
                }
                p3 = p3->next;
                p3->next = NULL;
            }
            
            if(p1){
                p3->next = p1;
            }else if(p2){
                p3->next = p2;
            }
            
            return newList->next;
        }
    };
    

    Q17 树的子结构

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    /**
    A:	两个步骤:1.【包不包括】判断顶点值是否相同
    			2.【是不是】顶点值的情况下A与B能不能对应上(注意A可能是大于B的
    */
    public class Solution {
        public boolean HasSubtree(TreeNode root1,TreeNode root2) {
            if(root2 == null || root1 == null)
                return false;
            
            if(root1.val == root2.val && IsSubtree(root1,root2))
                return true;
            else
                return HasSubtree(root1.left,root2) 
                || HasSubtree(root1.right,root2);
        }
        
        private boolean IsSubtree(TreeNode root1,TreeNode root2){
            if(root2 == null)return true;
            if(root1 == null)return false;
            
            if(root1.val != root2.val) return false;
            
            return IsSubtree(root1.left,root2.left) 
                && IsSubtree(root1.right,root2.right);
        }
    }
    

    Q18 二叉树的镜像

    操作给定的二叉树,将其变换为源二叉树的镜像。

    二叉树的镜像定义:源二叉树 
        	    8
        	   /  
        	  6   10
        	 /   / 
        	5  7 9 11
        	镜像二叉树
        	    8
        	   /  
        	  10   6
        	 /   / 
        	11 9 7  5
    
    public class Solution {
        public void Mirror(TreeNode root) {
            if(root == null) return;
            
            TreeNode tmp = root.left;
            root.left = root.right;
            root.right = tmp;
            
            Mirror(root.left);
            Mirror(root.right);
        }
    }
    
  • 相关阅读:
    Linux下通过.desktop 文件创建桌面程序图标及文件编写方式(Desktop Entry文件概述)
    Ubuntu16.04进入挂起或休眠状态时按任何键都无法唤醒问题解决办法
    Ubuntu16.04+Gnome3 锁定屏幕快捷键无效解决办法
    A start job is running for Raise network interface(5min 13s )问题解决方法
    Ubuntu16.04 “有线未托管”有线网络不可用问题解决
    A start job is running for Network Manager wait online (29s / no limit) 等待30s解决办法
    Linux 串口终端调试工具minicom
    Linux 终端仿真程序Putty
    Oracle:在 debian9 上完美安装 oracle 10.2.0.5 x64
    从debian9、ubuntu18.04的deb包依赖来看,似乎不是那么好!!
  • 原文地址:https://www.cnblogs.com/weseewe/p/11675032.html
Copyright © 2011-2022 走看看