京东2018在线笔试题 第一个编程大题
2017-09-09 15:57
267 查看
import java.util.*; /** * 京东笔试题: 2.如果"X"和“Y”是合法的库列那么“XY”也是一合法的括号库列 3.如果"X"合法的库列那么"(X)"也合法的括号库列 4. 每个合法的括号序列都可以甶上面的规则生成. 例如 "","()","()()()"都是合法的。现在有个合法的括号序列s,一次移除操作为两步: 1. 移除库列s中的第一个左括号 2. 移除库列s中任意 一个右括号. 保证操作后之后s还是一个合法的括好序列。 现在想知道使用上述的移除操作有多少种方案可以把序列s 变为空。 如果两个方案中有一次移除操作的移除的是不同的右括号就认为是不同的方案。 例如 s="()()()()",输出为1,因为每次都只能选择被移除的左括号所相邻的右括号. s="(((())))",输出为24,第一次有4种情况,第二次有3中情况,..一次类推 4*3*2*1 =24 输入描述: 输入包括一行,一个合法的括号序列s,序列长度 length (2<=lenth<=20). 输出,方案个数 */ public class Main { public static void main(String[] args) { // Scanner sc = new Scanner(System.in); // String n = sc.next(); // 40,41 String s="()()()"; System.out.println(cal(s)); } public static int cal(String string){ int count = 0; char[] chars = string.toCharArray(); if (chars[0]==')')return count; List list = countRight(chars); for (int i : list) { //切割括号后,substring 含头不含尾 String newString=string.substring(1,i)+string.substring(i+1,string.length()); if(validate(newString.toCharArray())){ // 只有两对以上括号才有计算价值,要不然就重复计算了 if(newString.length()>3){ count+=cal(newString); }else { count++; } } } return count; } public static List countRight(char[] chars) { List list =new ArrayList(); for (int i = 0; i < chars.length; i++) { if (chars[i] == ')') list.add(i); } return list; } public static boolean validate(char[] a){ Stack stack = new Stack(); for(int i=0;i
昨天晚上被这道题虐的死去活来的,终于想出了个能解决的算法,
我的思路的核心是用栈来 校验是否是合法的序列,
转化成 char数组来方便操作 字符串,这样就可以任意切割了。
然后 用递归来算出最终结果。
具体代码如下
相关文章推荐
- 今日头条2018实习生在线编程笔试题
- 2018小红书校招软件研发在线笔试编程第二题
- 网易2018 Android实习生在线编程笔试题
- 在线编程笔试练习2(京东)
- 京东2018校招在线笔试编程题①
- 在线编程笔试练习1(京东)
- 2017微软秋季校园招聘在线编程笔试
- 2017京东在线笔试编程题之 买东西
- [hihocoder1489][微软2017年预科生计划在线编程笔试][Legendary Items]
- 京东2015在线笔试----编程题--分苹果
- 2017微软秋季校园招聘在线编程笔试-#1401 : Registration Day
- CVTE 2018 Android在线笔试编程题
- 2017微软秋季校园招聘在线编程笔试 Composition
- 京东2015在线笔试 (1)
- 京东2016实习生招聘 C++开发工程师 在线考试(编程题第二题:选举游戏)
- 京东2016实习生在线笔试
- 幸运数字---京东2017年在线笔试题
- 2017年京东校招Java研发笔试编程第1题
- 阿里巴巴2018秋招在线编程测验--射击场
- 【2018校招笔试-京东=java开发】题目2 求幂