剑指offer51-55

Posted lgh544

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer51-55相关的知识,希望对你有一定的参考价值。

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];)

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        int[] B=new int[A.length];
        for(int i=0;i<A.length;i++){
            B[i]=1;
            for(int j=0;j<A.length;j++){
                if(j!=i){
                    B[i]*=A[j];
                }
            }
        }
        return B;
    }
}

52 表示数值的字符串

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

 

[-+]?

正负号后面的 ? 后缀表示这个负号是可选的,表示有0到1个负号或者正号

\d*

d的含义和[0-9]一样。它匹配一个数字。后缀 * 指引它可匹配零个或者多个数字。

(?:\.\d*)?

(?: …)?表示一个可选的非捕获型分组。* 指引这个分组会匹配后面跟随的0个或者多个数字的小数点。

(?:[eE][+\-]?d+)?

这是另外一个可选的非捕获型分组。它会匹配一个e(或E)、一个可选的正负号以及一个或多个数字。

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Solution {
    public boolean isNumeric(char[] str) {
         String s = new String(str);
        s = s.trim();
        String regex = "^[-+]?[0-9]+[.]?\d*[eE][-+]?\d+$|^[-+]?[0-9]+[.]?\d*$|^[-+]?[.][0-9]+[eE]?[-+]?\d+$|^[-+]?[.][0-9]+$";
                //"^[-+]?\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?$"

        Pattern pattern = Pattern.compile(regex);
        Matcher m = pattern.matcher(s);
        return m.matches();
    }
}

53字符流中第一个不重复的字符

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

import java.util.Map;
import java.util.LinkedHashMap;
public class Solution {
    //Insert one char from stringstream
    public void Insert(char ch)
    {
        stringBuilder.append(ch);
    }
    StringBuilder stringBuilder = new StringBuilder();
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        String str = stringBuilder.toString();
        Map<Character,Integer> map = new LinkedHashMap<>();
        for(int i = 0; i < str.length(); i++){
            int count = map.getOrDefault(str.charAt(i),0)+1;
            map.put(str.charAt(i),count);
        }
        for(Map.Entry<Character, Integer> entry: map.entrySet()) {
            if(entry.getValue() == 1){
                return entry.getKey();
            }
        }
        return #;
    }
}

54链表中环的入口节点

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

import java.util.Map;
import java.util.HashMap;
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        Map<ListNode,Integer> map = new HashMap<>();
        while(!map.containsKey(pHead)){
            if(pHead.next == null){
                return null;
            }
            map.put(pHead,1);
            pHead = pHead.next;
        }
              return pHead;
    }
}

55删除链表中重复的节点

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

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
时间复杂度:O(n)
空间复杂度:O(1)
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        ListNode head = new ListNode(-1);
        head.next = pHead;
        ListNode cur =pHead;
        ListNode pre = head;
        while(cur != null){
            if(cur.next != null && cur.val == cur.next.val){
                while(cur.next != null && cur.val == cur.next.val){
                    cur = cur.next;
                }
                cur = cur.next;
                pre.next = cur;
            }else{
               pre = cur;
               cur = cur.next;
            }
        }
        return head.next;
       
    }
}

 

以上是关于剑指offer51-55的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)

LeetCode(剑指 Offer)- 14- I. 剪绳子

LeetCode(剑指 Offer)- 14- I. 剪绳子

剑指offer——第二十九天(动态规划“困难”)