/*计算和,我们可以通过直接通过字符串计算
注意点1:我们在对应元素计算时,要注意讲ASCII码-'0';
注意点2:看是否有进位,尤其最后一位
注意点3: 字符串反转
注意4:StringBuilder 创建 相当于包装类 String
注意5:注意两个字符串可能不一样长,要注意下界
时间复杂度O(max(m.n)) 空间复杂度O(1)
*/
class Solution {
public String addStrings(String num1, String num2) {
StringBuilder str = new StringBuilder("");
int i = num1.length()-1;
int j = num2.length()-1;
int carry = 0 , num=0;
while(i>=0 || j>=0){
int x1 = i>=0 ? num1.charAt(i)-'0' : 0;
int x2 = j>=0 ? num2.charAt(j)-'0' : 0;
num = x1 + x2 + carry;
carry = num / 10;
str.append(num%10);
i--;
j--;
}
//这时候要看一下carry
if(carry == 1)
str.append(carry);
return str.reverse().toString();
}
}
/*
方法1:输出n次foobar,先输出foo,再输出bar,我们可以通过奇偶数判断,或者boolean判断,但是防止重排,注意用volatile修饰
方法2:也可以用奇偶数判断,但是本质和方法1一样,所以不写了
*/
class FooBar {
private int n;
private volatile boolean flag ;
public FooBar(int n) {
this.n = n;
}
public void foo(Runnable printFoo) throws InterruptedException {
for (int i = 0; i < n; i++) {
while(flag){
Thread.yield();
}
// printFoo.run() outputs "foo". Do not change or remove this line.
printFoo.run();
flag = true;
}
}
public void bar(Runnable printBar) throws InterruptedException {
for (int i = 0; i < n; i++) {
while(!flag){
Thread.yield();
}
// printBar.run() outputs "bar". Do not change or remove this line.
printBar.run();
flag = false;
}
}
}