快手笔试第1,2,4题答案 4-12下午场B卷
做题的熟练度不够,思路不是特别清晰,代码有很多可以优化的空间
希望大家一起讨论
第一题:数括号数量,用一个栈保存
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s=in.nextLine();
char[] chars=s.toCharArray();
int pair=0;
int l=0;
int r=0;
Deque<Character> stack=new LinkedList<>();
for (int i = 0; i <chars.length ; i++) {
if(chars[i]=='('){
stack.addLast(chars[i]);
}else if(chars[i]==')'){
if(!stack.isEmpty()&&stack.peekLast()=='('){
stack.pollLast();
pair+=1;
}else {
stack.addLast(chars[i]);
}
}
}
for (char c:stack ) {
if(c=='('){
l+=1;
}else if(c==')'){
r+=1;
}
}
StringJoiner sj=new StringJoiner(" ");
sj.add(String.valueOf(pair));
sj.add(String.valueOf(l));
sj.add(String.valueOf(r));
System.out.println(sj.toString());
}
} 第二题:AC,但是代码写的很杂乱 完美数的因子:
例如完美数R=39,底数N=3
39=3^1 + 3^2 +3^3
输出[1,2,3]
public class Solution {
/**
* 返回无重复幂因子的 N进制完美数之和的所有幂因子
* @param R int整型
* @param N int整型 N进制
* @return int整型一维数组
*/
public int[] GetPowerFactor (int R, int N) {
// write code here
List<Integer> res=helper(R,N);
if(res==null){
return new int[0];
}
int[] result=new int[res.size()];
for (int i = 0; i <res.size() ; i++) {
result[i]=res.get(i);
}
return result;
}
public List<Integer> helper (int R, int N){
if(R%N!=0&& (R-1)%N!=0){
return null;
}
List<Integer> res;
if(R==0){
return new ArrayList<>();
}
if((R-1)%N==0){
res=helper(R-1,N);
if(res==null){
return res;
}
res.add(0,0);
return res;
}
if(R%N==0){
res=helper(R/N,N);
if(res==null){
return res;
}
for (int i = 0; i < res.size() ; i++) {
res.set(i,res.get(i)+1);
}
return res;
}
return null;
}
} 第三题: 没有时间做了,希望有大佬能补充思路
第四题:
输入二维数组,找到不相邻位置的数量
类似于8皇后问题,使用回溯法
public class Main4 {
/**
* 获取最大可同事办公员工数
* @param pos char字符型二维数组 工位分布
* @return int整型
*/
int maxNum=0;
int N;
int M;
public int GetMaxStaffs (char[][] pos) {
// write code here
N=pos.length;
M=pos[0].length;
trace(0,pos,new boolean[N][M],0);
return maxNum;
}
public void trace(int p,char[][] pos,boolean[][] bitmap,int num){
if(p>=N*M){
maxNum=Math.max(maxNum,num);
return;
}
// System.out.println(p);
if(pos[p/M][p%M]=='*'){
trace(p+1, pos, bitmap, num);
return;
}
if((p%M>0 && bitmap[p/M][p%M-1]) || (p/M>0&&bitmap[p/M-1][p%M])){
trace(p+1, pos, bitmap, num);
return;
}
boolean[][] bitmap2=new boolean[N][M];
for (int k = 0; k <N; k++) {
bitmap2[k]=bitmap[k].clone();
}
trace(p+1, pos, bitmap2, num);
bitmap[p/M][p%M]=true;
trace(p+1, pos, bitmap, num+1);
}
}