目录
力扣.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; } }