这种用字符串模拟数字,无论加法乘法一般都是模拟人竖式计算的过程,比如加法可以拆解为每一位对应的加法,然后只保留余数,进位就放到下一位之后一起加。
这里乘法也是一个道理,乘法根据分配律可以拆分为,比如123 x 456 = 123x(400+50 +6) ,只需要用被拆开的数字分别与123的每一位相乘即可,如果存在进位就加到下一位的结果上。当每个位数乘完再全部加起来就是答案了。
class Solution {
public String multiply(String num1, String num2) {
int[] ans = new int[num1.length()+num2.length()];
for(int i=num1.length()-1;i>=0;i--){
int ii = num1.charAt(i)-'0';
for(int j =num2.length()-1;j>=0;j--){
int jj = num2.charAt(j)-'0';
int inx = num1.length()+num2.length()-2-i-j;
ans[inx] += ii*jj%10;
ans[inx+1] += ii*jj/10+ans[inx]/10;
ans[inx] %=10;
}
}
boolean f = false;
StringBuilder sb = new StringBuilder();
for(int i=ans.length-1;i>=0;i--){
if(!f&&ans[i]==0)
continue;
f = true;
sb.append(ans[i]);
}
String a = sb.length()==0?"0":sb.toString();
return a;
}
}
首先将每层的名字,每层名字是用‘/’进行分割的,存入一个栈中。如果是常规路径名就直接存入,如果遇到…就弹出上一次存入的名字,其他情况都直接跳过(比如空,或者.)。
然后再遍历栈,在‘/’与栈中输出进行组合,存入一个字符串中。
class Solution {
public String simplifyPath(String path) {
String[] sArr = path.split("/");
Stack<String> stack = new Stack<>();
for(String s:sArr){
if(s.equals("..")){
if(!stack.isEmpty())
stack.pop();
}else if(!s.equals(".")&&s.length()!=0){
stack.push(s);
}
}
StringBuilder sb = new StringBuilder();
for(String s:stack){
sb.append("/").append(s);
}
if(sb.length()==0)
return "/";
else
return sb.toString();
}
}