• 算法学习之剑指offer(十)


    题目描述

    请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

    public class Solution {
        public boolean isNumeric(char[] str) {
            String string = String.valueOf(str);
            return string.matches("[\+-]?[0-9]*(\.[0-9]*)?([eE][\+-]?[0-9]+)?");
        }
    }

    题目描述

    请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

    输出描述:


    import java.util.*;
    public class Solution {
        
        private Map<Character,Integer> map = new LinkedHashMap<Character,Integer>();
        
        //Insert one char from stringstream
        public void Insert(char ch)
        {
            if(map.containsKey(ch))
                map.put(ch,2);
            else
                map.put(ch,1);
        }
      //return the first appearence once char in current stringstream
        public char FirstAppearingOnce()
        {
            for(Character cc:map.keySet()){
                if(map.get(cc).intValue()==1)
                    return cc;
            }
            return '#';
        }
    }

    一个链表中包含环,请找出该链表的环的入口结点。

    /*
     public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }
    */
    public class Solution {
    
        public ListNode EntryNodeOfLoop(ListNode pHead)
        {
            if(pHead==null)
                return null;
            ListNode meetNode = getMeetNode(pHead);
            if(meetNode==null)
                return null;
            int count=1;//计算节点
            ListNode node=meetNode.next;
            while(meetNode!=node){
                node=node.next;
                count++;
            }
            ListNode slowNode=pHead,fastNode=pHead;
            for(int i=0;i<count;i++)
                fastNode=fastNode.next;
             while(slowNode!=null&&fastNode!=null){
                 if(slowNode==fastNode)
                    return fastNode;
                 slowNode = slowNode.next;
                 fastNode = fastNode.next;
             }
            return null;
        }
        
        public ListNode getMeetNode(ListNode pHead){
            ListNode slowNode=pHead,fastNode=pHead;
            while(slowNode!=null&&fastNode!=null){
                slowNode = slowNode.next;
                fastNode = fastNode.next;
                if(fastNode!=null)
                    fastNode = fastNode.next;
                if(slowNode==fastNode)
                    return fastNode;
            }
            return null;
        }
    }

    题目描述

    在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

    /*
     public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }
    */
    public class Solution {
        public ListNode deleteDuplication(ListNode pHead)
        {
            ListNode node = pHead;
            ListNode LastNode = null;
            while(node!=null){
                if(node.next==null)
                    break;
                if(node.val==node.next.val){
                    if(LastNode == null){
                        pHead=deleteSame(node);
                        node = pHead;
                    }
                    else{
                        node = deleteSame(node);
                        LastNode.next=node;
                    }
                }else{
                    LastNode=node;
                    node=node.next;
                }
            }
            return pHead;
        }
         public ListNode deleteSame(ListNode node)
         {
             int sameValue = node.val;
             while(node!=null&&node.val==sameValue)
                 node=node.next;
             return node;
         }
    }

    题目描述

    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

    /*
    public class TreeLinkNode {
        int val;
        TreeLinkNode left = null;
        TreeLinkNode right = null;
        TreeLinkNode next = null;
    
        TreeLinkNode(int val) {
            this.val = val;
        }
    }
    */
    public class Solution {
        public TreeLinkNode GetNext(TreeLinkNode pNode)
        {
            if(pNode==null)
                return null;
            if(pNode.right!=null){
                pNode=pNode.right;
                while(pNode.left!=null)
                    pNode=pNode.left;
                return pNode;
            }
            while(pNode.next!=null){
                if(pNode.next.left==pNode)
                    return pNode.next;
                pNode=pNode.next;
            }
            return null;
        }
    }

    题目描述

    请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    public class Solution {
        boolean isSymmetrical(TreeNode pRoot)
        {
            if(pRoot==null)
                return true;
            return is2Same(pRoot.left,pRoot.right);
        }
        boolean is2Same(TreeNode pLeft,TreeNode pRight)
        {
            if(pLeft==null&&pRight==null)
                return true;
            if(pLeft!=null&&pRight!=null){
                return pLeft.val==pRight.val&&is2Same(pLeft.left,pRight.right)&&is2Same(pLeft.right,pRight.left);
            }
            return false;
            
        }
    }

  • 相关阅读:
    二分图之最小边覆盖(poj3020)
    第一章:计算机网络概述
    X Window 简单的新手教程
    SharePoint Permission Analyzer 权限分析仪
    《源创新》:破坏性创新换了个说法,有陷入锤子钉子模式的嫌疑,书中的案例可以看一看。
    《金融可以颠覆历史》:隐藏在历史事件背后的金融制度发展历程
    转发:三伏天话“三伏贴”
    《浪潮之巅》(第2版):精彩的IT商战史
    《史玉柱自述》:管理者要谦虚,好的经营策略是试出来的
    《生活中的经济学》:主张让市场去解决生活中的问题,离中国的现实有点远
  • 原文地址:https://www.cnblogs.com/chz-blogs/p/9380922.html
Copyright © 2020-2023  润新知