我正在尝试解决问题#299 - 在网站UVa在线评判中进行列车交换。我的代码适用于独立的测试用例。但是,当我使用他们提供的示例输入时,我的程序省略了一个测试用例,最后一个更具体:
这是我的代码:
import java.util.Scanner;
public class Tester {
void problem(){
Scanner imput = new Scanner(System.in);
int numT =imput.nextInt();
int numL, aux, swaps=0;
int [] train = new int [50];
for (int i =0; i<numT; i++) {
numL = imput.nextInt();
for (int m =0; m< numL; m++) {
train[m]=imput.nextInt();
}
for (int j=0; j<numL; j++) {
if (train[j]>train[j+1]) {
for (int k =j; k<numL-1;k++) {
aux = train[k];
train[k]=train[k+1];
train[k+1]=aux;
swaps++;
}
}
}
System.out.println("Optimal train swapping takes "+swaps+" swaps.");
swaps = 0;
}
}
}
示例输入:
3
3
1 3 2
4
4 3 2 1
2
2 1
示例输出:
Optimal train swapping takes 1 swaps.
Optimal train swapping takes 6 swaps.
Optimal train swapping takes 1 swaps.
我的代码打印到第二个解决方案,然后由于某种原因停止。我试图调试它并逐步检查发生了什么,但它让我陷入了偏头痛的境地。任何见解都受到高度赞赏。
... 更确切地说,它第二次停在第二次为循环而没有任何东西进入数组......我不知道为什么!
我发现的另一件事是,为了解决这个问题,中间情况下的交换次数是6,因此冒泡排序在这里不会有用,因为它会产生超过10个交换因此产生错误的输出,这是然而,与我提出的原始问题不同。我仍然没有弄清楚为什么它第三次在循环中停止,我第三次为数组赋值。
答案 0 :(得分:1)
按如下方式重新排列循环:
for(int j=0; j<numL; j++){
for(int k =j+1; k<numL;k++){
if(train[j]>train[k]){
aux = train[j];
train[j]=train[k];
train[k]=aux;
swaps++;
}
}
}
编辑:表现。
如果您按照以下方式组织代码,则可以最小化for循环:
public class Main {
static int sum=0;
public static void sort(String[] str){
for(int i = 1; i < str.length; i++)
if(Integer.parseInt(str[i])<Integer.parseInt(str[i-1])){
String h = str[i];
str[i] = str[i-1];
str[i-1] = h;
sum++;
sort(str);
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine().trim());
for (int i = 0; i < n; i++) {
sum = 0;
int x = Integer.parseInt(in.readLine().trim());
String s[] = in.readLine().trim().split(" +");
sort(s);
System.out.println("Optimal train swapping takes " + sum + " swaps.");
}
}
}