合法括号序列判断_另类加法_走方格的方案数
合法括号序列判断
import java.util.*;
public class Parenthesis {
public boolean chkParenthesis(String A, int n) {
// write code here
//根据题意,字符串只能由扩号组成!
if(n%2==1){//字符长度为奇数,说明不匹配
return false;
}
Stack<Character> stack = new Stack<>();
for(int i = 0;i< n; i++){
char ch = A.charAt(i);
if(ch=='('){
//左括号就入栈!
stack.add(ch);
}else if(ch==')'){
//右括号,匹配出栈!
if(stack.isEmpty()||stack.peek()==')'){
//如果栈空,或者栈顶值为 ')' 说明匹配失败!
return false;
}else{
//匹配成功
stack.pop();
}
}else{
//其他字符说明匹配失败!
return false;
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
} 另类加法
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
// write code here
// 两个数 异或(^)结果为两数之和 不考虑进位!!!
// 两个数 按位与(&)后,左移1位结果为是否进位, 只考虑进位!
// 例如: 3 + 2
// 3 0011
// 2 0010
//sum = 0011^0010 = 0001
//carry = (0011&0010)<<1 = 0100
//然后再将 sum 和carry 分别赋值给 A和B即可!
// 知道 B == 0也就不用进位,此时sum 结果就为 A+B
int sum = 0;
int carry = 0;
while(B!=0){
sum = A^B;
carry = (A&B)<<1;
A = sum;
B = carry;
}
return A;
}
} 走方格的方案数
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] array = new int[n+1][m+1];
//dp动态规划
//状态定义: 到达(i,j)位置的走法!
//状态转移方程:f(i,j) = f(i-1,j) + f(i,j-1);
//初始状态:f(i,0) = 1 ,f(0,j) = 1;
//返回结果:f(n,m)!!!
//初始化
for(int i = 0;i<=n;i++){
array[i][0] = 1;
}
for(int i = 0;i<=m;i++){
array[0][i] = 1;
}
for(int i = 1; i <= n;i++){
for(int j = 1;j <= m;j++){
array[i][j] = array[i-1][j] + array[i][j-1];
}
}
System.out.println(array[n][m]);
}
} 

