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 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;
}
}
-
动态规划
代码
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;
}
}