2 a1394393468 a1394393468 于 2016.03.07 10:36 提问

【JAVA算法】凑字数凑字数啦

题目是这样的

 第一行两个数,分别为n,m。
  第二行n个数,表示盾神一开始的项链。第i个数表示第i颗珠子的颜色。
  接下来m行,为以下形式之一:
  ADD P Q:表示在颜色为P的珠子前面加上一个颜色为Q的珠子。
  DEL P:表示把颜色为P的珠子去掉,如果它不在端点处,则需要把它旁边的两颗珠子连起来。例如某时刻项链状态为1 4 5 8,则执行DEL 4会变成1 5 8,执行DEL 1会变成4 5 8。
  输入保证在每次操作之前,项链有颜色为P的珠子,且任意时刻珠子颜色互不相同。
输出格式
  第一行为一个数len,为做完所有操作后,项链的长度。
  第二行len个数,表示此时项链的状态。第i个数表示第i颗珠子的颜色。
样例输入
10 5
1 2 3 4 5 6 7 8 9 10
DEL 5
ADD 7 5
DEL 10
ADD 4 20
ADD 20 12
样例输出
11

1 2 3 12 20 4 6 5 7 8 9

-------------------------代码-------------------------
public static void main(String[] args) {

ArrayList list = new ArrayList();
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
for (int i = 0; i < n; i++) {
list.add(scan.nextInt());
}
for (int i = 0; i < m; i++) {
String s = scan.next();
if (s.equals("ADD")) {
int a = scan.nextInt();
int b = scan.nextInt();
list.add(list.indexOf(a),b);
}
else{
int a = scan.nextInt();
int b = list.indexOf(a);
list.remove(b);
}
}
System.out.println(list.size());
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i)+" ");
}

}

用JAVA 很好写 但是很多数据之后会运行超时或者根本运行不出来
求问大神 有没有简单的办法

3个回答

u013596119
u013596119   Rxr 2016.03.07 11:02

我觉得你可以加个map试试,储存颜色P对应的珠子的位置,比如一开始1,2,。。,20,1就对应1 ,2就对应2.。。。然后加入珠子就update这个颜色的珠子的位置,这样一是节省add里indexof的时间,二是可以用removeat代替remove

lx624909677
lx624909677   Ds   Rxr 2016.03.07 15:53

很多数据之后会运行超时或者根本运行不出来,这说明你程序本身就有逻辑问题了,而不是说方法复杂,运行不出来,很可能是某个地方死循环了

cxsmarkchan
cxsmarkchan   2016.03.09 19:20

ArrayList内部采用数组存储,ADD和DEL涉及增删元素,复杂度比较高,不妨把ArrayList换成LinkedList?其他的不用变,复杂度可以从O(mn^2)提升到O(mn)。如果还要进一步提升速度,可以按楼上说的,使用map记录。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!