目录
力扣.43.字符串相乘
力扣1047.删除字符串中的所有相邻重复项
力扣.844比较含退格的字符串
力扣227.基本计算器II
力扣.43.字符串相乘
我们剩下的落两个数字即可。
class Solution {public static String multiply(String num1, String num2) {int m=num1.length();int n=num2.length();int[]a=new int[m+n-1];int p=1;int sum=m+n-1; //处理特殊情况,假如出现前导0的情况,即123乘0,此时会出现0,0,0,0这种情况,多个0 是没用的,所以遇到0直接返回即可// if(num1.equals("0")||num2.equals("0"))return "0";StringBuffer s=new StringBuffer();for(int j=n-1;j>=0;j--){int k=sum-p;for(int i=m-1;i>=0;i--){a[k--]+=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');}p++;}for(int i=sum-1;i>0;i--){a[i-1]+=a[i]/10;a[i]=a[i]%10;}for(int i=0;i<a.length;i++){s.append(a[i]);}//我们可以想一下什么情况会有前导0,只有当x*0时候会出现前导0,因此我们可以上面那种处理方式 //也可以用下面这种方式,我必须要保持前导0,最多存在一个就是0,其余的假如第一个是0,我们就把它删除while(s.length()>1&&s.charAt(0)=='0'){s.deleteCharAt(0);}return s.toString();}}
while(s.length()>1&&s.charAt(0)=='0'){
s.deleteCharAt(0);
}
力扣1047.删除字符串中的所有相邻重复项
class Solution {public static String removeDuplicates(String s) {Stack<Character>a=new Stack<>();for(int i=0;i<s.length();i++){if(!a.isEmpty()&&a.peek()==s.charAt(i)){a.pop();}else{a.add(s.charAt(i));}}StringBuffer ret=new StringBuffer();while (!a.isEmpty()){ret.append(a.pop());}return ret.reverse().toString();}
}
力扣.844比较含退格的字符串
用栈进行基本的模拟,然后假如出现#就删除
class Solution {public boolean backspaceCompare(String s, String t) {Stack<Character>a=new Stack<>();Stack<Character>b=new Stack<>();for(int i=0;i<s.length();i++){if(!a.isEmpty()&&s.charAt(i)=='#'){a.pop();}else if(a.isEmpty()&&s.charAt(i)=='#'){continue;}else{a.add(s.charAt(i));}}for(int i=0;i<t.length();i++){if(!b.isEmpty()&&t.charAt(i)=='#'){b.pop();}else if(b.isEmpty()&&t.charAt(i)=='#'){continue;}else{b.add(t.charAt(i));}}if(a.size()!=b.size()) return false;while(!a.isEmpty()){if(a.pop()!=b.pop()){return false;}}return true;}
}
力扣227.基本计算器II
考验代码能力细节很多,使用两个栈,当然这么写也是因为我菜,题解肯定比我好很多,我一会抄一手,学习一下,
public static int calculate(String s) {char[]ss=s.toCharArray();//这个来存储符号Stack<Character>a=new Stack<>();//这个存储数字,为什么要双栈,因为假如超过100000,字符无法存储这么大的整数Stack<Integer>b=new Stack<>();int tmp=0;int k=0;for(int i=0;i<ss.length;i++){if(ss[i]==' ') continue;//思考一下,假如342怎么办,往前面找是否是一个好的想法 假如一个情况3*42/66换句话说,我们应该计算第一个循环就把这种统计出来//而他更需要进行一个所谓的优先处理,只要他不是符号,我们都检查一下(这个应该是优于乘除法的)if(ss[i]-'0'>=0) {StringBuffer p = new StringBuffer();//假如前一个是4,来一个循环遍历一手while (i < ss.length && ss[i] - '0' >= 0) {p.append((ss[i]-'0'));if(i+1<ss.length&&ss[i+1]-'0'>=0) {//只有当下一个不是符号的时候,才可以加加i++;}else{break;}}k = Integer.valueOf(p.toString());b.add( k);} else if(ss[i]-'0'<0){a.add(ss[i]);}//假如是乘法或者是除法我们进行优先处理,因为没有括号,并且当前值不可以是符号就进行计算,进行计算的时候,一定保证是数字if(!a.isEmpty()&&ss[i]-'0'>=0&&(a.peek()=='*'||a.peek()=='/')){if(a.peek()=='*'){a.pop();tmp=b.pop()*b.pop();b.add(tmp);}else if(a.peek()=='/'){a.pop();int t=b.pop();tmp=b.pop()/t;b.add(tmp);}}//当他是符号时候,先去添加符号}
//上面我们相当于把乘法和除法处理完成,最后应该只剩下加法了//3+2+3+4
// tmp=0; //暂时保存值
//int sum=0;while (!a.isEmpty()&&!b.isEmpty()) {//处理加法的情况while (!a.isEmpty()&&!b.isEmpty()&&a.peek() == '+') {a.pop();sum+= b.pop();}while(!a.isEmpty()&&!b.isEmpty()&&a.peek() == '-') {a.pop();int t = b.pop();sum-=t;}}if(!b.isEmpty()) sum+=b.pop();return sum;}
较为优秀的写法,使用了一个栈,并且把上面我的逻辑相当于更加一步的理清,并且删除了一些不必要的冗余代码
class Solution {public static int calculate(String s) {char[]ss=s.toCharArray();//这个来存储符号Stack<Integer>b=new Stack<>();char op='a';int k=0;for(int i=0;i<ss.length;i++){if(ss[i]==' ') continue;if(ss[i]-'0'>=0){StringBuffer p = new StringBuffer();//这里的想法是,我们不去处理什么倍数乘10,乘100,太过麻烦,不如就使用字符串的拼接,直接拼到一起,这样会更省心,但是带来的就是时间while (i < ss.length && ss[i] - '0' >= 0) {p.append((ss[i]-'0'));if(i+1<ss.length&&ss[i+1]-'0'>=0) {i++;} //只有当下一个不是符号的时候,才可以加加else{break;}}k = Integer.valueOf(p.toString());//假如是乘法或者是除法我们进行优先处理,因为没有括号,并且当前值不可以是符号就进行计算,进行计算的时候,一定保证是数字if(op=='*'){ b.add(b.pop()*k);}else if(op=='/'){b.add(b.pop()/k);}else if(op=='-'){b.add(-k); }else{b.add(k); } op='+';continue;}//当他是符号时候,先去添加符号else {op=ss[i]; continue;}} //上面我们相当于把乘法和除法,减法处理完成,最后应该只剩下加法了int sum=0;while(!b.isEmpty()){sum+=b.pop();}return sum;} }