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