京东2018年校园招聘笔试代码环节答案分享

第一题:括号匹配问题

合法的括号匹配序列被定义为:

1.空串“”是合法的括号序列;

2.如果X和Y是合法序列,那么XY一定是合法序列

3.如果X是合法序列,那么(X)也一定是合法序列

4.每个合法的库哦啊好序列都可由上面的规则生成。

东东现在有一个合法的括号序列S,一次移除操作分为两步:

1.移除序列最左边的一个左括号;

2.移除序列s中任意一个右括号。保证操作之后s还是一个合法的括号序列。

东东现在想知道使用上述的移除操作有多少种方法可以吧序列s变为空。

如果两个方案中又一次一处操作移除的是不同右括号,就认为是不同的方案。

比如说s="()()()"输处1.因为只有一种可能。

而s="(((())))"输处24,第一次有4中情况,第二次有3种情况,一次类推,有4*3*2*1=24种情况。

这个问题,只需要维护一个变量tmp,然后遇到(就加,遇到)就在现有基础上*tmp然后tmp--即可。

public static int process(String str){
		int res = 1;
		int tmp = 0;
		for(int i=0;i<str.length();i++){
			if(str.charAt(i)=='(')
				tmp++;
			else{
				res*=tmp;
				tmp--;
			}
		}
		return res;
}

第二题,我认为可以先把基础的数量计算进去,分别是N^2+2+3+...N。然后再看幂级数存在交叉的。

而且如果是2交叉到4,那么2^pow = 4,这时候有一个pow,那么pow是可以指数增长直到N的,并且只能是pow指数增长,4才可能有一个数幂和2^pow相同。

也就是有pow*pow...*pow<=n的时候,的pow个数。

同理,从2开始遍历检索,3,4,5,6但是这时候也存在一个问题,就是没有考虑到4,8的情况,因为4^pow!=8,所以可能还是存在问题。这个就看有没有别的大神想出来了。




猜你喜欢

转载自blog.csdn.net/u013576018/article/details/77899193