剑指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. 剪绳子