剑指offer题解51-55(Java)

51.构建乘积数组

给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

代码

  1. 简单粗暴法
import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        int len=A.length;
        int[] B=new int[len];
        for(int i=0;i<len;i++){
            int temp=1;
            for(int j=0;j<len;j++){
                if(j!=i){
                    temp*=A[j];
                }   
            }
            B[i]=temp;
        }
return B;
    }
}
  1. 动态规划

    代码

    public class Solution {
        public int[] multiply(int[] A) {
            int length = A.length;
            int[] B = new int[length];
            if(length != 0 ){
                B[0] = 1;
                //计算下三角
                for(int i = 1; i < length; i++){
                    B[i] = B[i-1] * A[i-1];
                }
                int temp = 1;
                //计算上三角
                for(int j = length-2; j >= 0; j--){
                    temp *= A[j+1];
                    B[j] *= temp;
                }
            }
            return B;
        }
    }
    

52.正则表达式匹配

请实现一个函数用来匹配包括’.‘和’*‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

我的错误代码

public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        
        int s=str.length;
        int p=pattern.length;
        int flag=0;
        if(s==0&&p==0)return true;
        if(s==0^p==0)return false;
        while(true){
            if(s<0&&p<0) return true;
            if((s<0&&p>=0)||(s>=0&&p<0)) return false;
            if(pattern[p]=='.'){
                p--;
                s--;
            }
            else if(pattern[p]=='*'){
                flag=1;
                p--;
            }
            else{
                if(pattern[p]!=str[s]){
                    if(flag==1){
                        p--;
                        flag=0;
                    }
                    else{
                        return false;
                    }
                }
                else{
                    if(flag==1){
                        s--;
                    }
                    else{
                        p--;
                        s--;
                    }
                }
            }
        }
       
    }
}

代码

public class Solution {
    public boolean match(char[] str, char[] pattern) {
    if (str == null || pattern == null) {
        return false;
    }
    int strIndex = 0;
    int patternIndex = 0;
    return matchCore(str, strIndex, pattern, patternIndex);
}
  
public boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex) {
    //有效性检验:str到尾,pattern到尾,匹配成功
    if (strIndex == str.length && patternIndex == pattern.length) {
        return true;
    }
    //pattern先到尾,匹配失败
    if (strIndex != str.length && patternIndex == pattern.length) {
        return false;
    }
    //模式第2个是*,且字符串第1个跟模式第1个匹配,分3种匹配模式;如不匹配,模式后移2位
    if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {
        if ((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)) {
            return matchCore(str, strIndex, pattern, patternIndex + 2)//模式后移2,视为x*匹配0个字符
                    || matchCore(str, strIndex + 1, pattern, patternIndex + 2)//视为模式匹配1个字符
                    || matchCore(str, strIndex + 1, pattern, patternIndex);//*匹配1个,再匹配str中的下一个
        } else {
            return matchCore(str, strIndex, pattern, patternIndex + 2);
        }
    }
    //模式第2个不是*,且字符串第1个跟模式第1个匹配,则都后移1位,否则直接返回false
    if ((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)) {
        return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
    }
    return false;
    }
}

53.表示数值的字符串

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

代码

字符串处理还是要用到正则表达式子

import java.util.regex.Pattern;
public class Solution {
    public static boolean isNumeric(char[] str) {
        String pattern = "^[-+]?\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?$";
        String s = new String(str);
        return Pattern.matches(pattern,s);
    }
}

54.字符流中第一个不重复的字符

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

输出描述:

如果当前字符流没有存在出现一次的字符,返回#字符。

代码

没太懂题目的意思

import java.util.Queue;
import java.util.LinkedList;
import java.lang.Character;
 
public class Solution {
    int[] charCnt = new int[128];
    Queue<Character> queue = new LinkedList<Character>();
 
    //Insert one char from stringstream
    public void Insert(char ch) {
        if (charCnt[ch]++ == 0) //新来的单身字符,入队
            queue.add(ch);
    }
    //return the first appearence once char in current stringstream
    public char FirstAppearingOnce() {
        Character CHAR = null;
        char c = 0;
      //队列不为空
        while ((CHAR = queue.peek()) != null) {
            c = CHAR.charValue();//asc码
            if (charCnt[c] == 1) //判断是否脱单了,没脱单则输出
                return c;
            else queue.remove(); //脱单了就移出队列,它不会再回来了
        }
        return '#'; //队空,返回#
    }
}

55.链表中环的入口

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

代码

无脑法

import java.util.HashSet;

public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead) {
        HashSet<ListNode> set=new HashSet<ListNode>();
        while(pHead!=null){
          
            if(set.contains(pHead)){
                return pHead;
            }
            else{
                
                 set.add(pHead);
                pHead=pHead.next;
               
            }
        }
        return null;

    }
}

快慢指针

/*
 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||pHead.next==null||pHead.next.next==null) return null;
        ListNode fast=pHead.next.next;
        ListNode slow=pHead.next;
        while(fast!=slow){
            if(fast==null||slow==null)return null;
               fast=fast.next.next;
                slow=slow.next;
        }
        fast=pHead;
        while(fast!=slow){
            fast=fast.next;
              slow=slow.next;
        }
        return fast;
    }
}

你可能感兴趣的:(剑指offer)