算法训练营(第一期)第十天(java)
学习感悟:
题目
一、有效的括号(leetcode20)
错误解法:使用hash法过程太过于复杂
class Solution {
public boolean isValid(String s) {
//本题可以使用hash表来解决
char[] c=s.toCharArray();
int[] a=new int[3];
if(c.length%2!=0) return false;
for(int i=0;i<c.length;i++){
if(i%2!=0){
if(c[i]!='}'&&c[i]!=')'&&c[i]!=']') return false;
}
if(c[i]=='('){
a[0]++;
}else if(c[i]=='['){
a[1]++;
}else if(c[i]=='{'){
a[2]++;
}else if(c[i]==')'){
a[0]--;
}
else if(c[i]==']'){
a[1]--;
}
else if(c[i]=='}'){
a[2]--;
}
}
for(int i=0;i<a.length;i++){
if(a[i]!=0) {
return false;
}
}
return true;
}
}
正确解法:使用栈来解决问题
class Solution {
public boolean isValid(String s) {
//本题采用栈的方式来解决问题.
char[] c=s.toCharArray();
Stack st=new Stack();
for(int i=0;i<c.length;i++){
if(c[i]=='('){
st.push(')') ;
}else if(c[i]=='{'){
st.push('}');
}else if(c[i]=='['){
st.push(']');
}else{
if(st.isEmpty()) return false;
char c1=(char)st.peek();
if(c1!=c[i]){
return false;
}else{
st.pop();
}
}
}
if(st.isEmpty()) return true;
else return false;
}
}
二、删除字符串中的所有相邻重复项(leetcode1047)
题目
解法:
class Solution {
public String removeDuplicates(String s) {
//本题若是采用数组的方法比较麻烦涉及到移动位置,而且还不知道要移动多少次
//那么就使用栈的方法
char[] c=s.toCharArray();
Stack st=new Stack();
for(int i=0;i<c.length;i++){
if(!st.isEmpty()){
if(c[i]==(char)st.peek()){
st.pop();
}else{
st.push(c[i]);
}
}else{
st.push(c[i]);
}
}
String s1="";
while(!st.isEmpty()){
char c1=(char)st.pop();
s1+=c1;
}
return new StringBuffer(s1).reverse().toString();
}
}
三、逆波兰表达式求值(leetcode150)
题目
麻烦且错误解法:
class Solution {
public int evalRPN(String[] tokens) {
//遇到这个题目我们应该先把题目理解清晰,这个题目的意思是没读入一个数字就压入栈中,每读入一个符号就弹出两个数字参与运算再压入栈中.那么这个题目显然就要使用栈了;
Stack st=new Stack();
for(int i=0;i<tokens.length;i++){
//如果使用char数组没有String方便
char[] c=tokens[i].toCharArray();
char m=c[0];
if(m=='*'||m=='+'||m=='-'||m=='/'){
int a=(int)((char)st.pop());
if(st.isEmpty()) return a;
int b=(int)((char)st.pop());
int x=0;
if(m=='*') x=a*b;
if(m=='+') x=a+b;
if(m=='-') x=a-b;
if(m=='/') x=a/b;
st.push((char)x);
}else{
st.push(m);
}
}
return (int)((char)st.pop());
}
}
正确且间接解法:
class Solution {
public int evalRPN(String[] tokens) {
//遇到这个题目我们应该先把题目理解清晰,这个题目的意思是没读入一个数字就压入栈中,每读入一个符号就弹出两个数字参与运算再压入栈中.那么这个题目显然就要使用栈了;
//利用泛型可以帮助我们进行类型的限定
Stack<Integer> st=new Stack();
for(int i=0;i<tokens.length;i++){
//如果使用char数组没有String方便
if(tokens[i].equals("+")){
st.push(st.pop() + st.pop());
}
else if(tokens[i].equals("-")){
st.push(-st.pop() + st.pop());
}
else if(tokens[i].equals("*")){
st.push(st.pop()*st.pop());
}
else if(tokens[i].equals("/")){
int temp1=st.pop();
int temp2=st.pop();
st.push(temp2/temp1);
}else{
st.push(Integer.valueOf(tokens[i]));
}
}
return st.pop();
}}