【发布时间】:2014-10-17 05:08:34
【问题描述】:
问题是here。 我写了一个代码来完成这个任务。
/**
* Created by aditya on 16-10-2014.
*/
import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scan = new Scanner(new BufferedInputStream(System.in));
int n = scan.nextInt();
int k = scan.nextInt();
ArrayList<Integer> list = new ArrayList<Integer>(k);
ArrayList<Integer> list_out = new ArrayList<Integer>(k);
for (int i = 0; i < k; i++) {
list.add(scan.nextInt());
}
for (int j = 0; j < k; j++) {
list_out.add(next_perm(list.get(j), n));
}
for (int temp : list_out) {
System.out.println(temp);
}
System.out.flush();
}
public static int next_perm(int k, int n) {
int perm = 0;
int number = k;
int num[] = new int[n];
for (int i = 0; i < n; i++) {
num[i] = number % 10;
number /= 10;
}
int k_max = 0;
for (int i = 0; i < n; i++) {
if (i == (n-1))
break;
if (num[i + 1] >= num[i]) {
++k_max;
} else if (num[i + 1] < num[i]) {
break;
}
}
if(k_max==(n-1))return k;
int j_max = k_max+1;
for (int i = k_max; i >= 0; i--) {
if (num[i] > num[k_max + 1]) {
--j_max;
} else {
break;
}
}
int temp=num[j_max];
num[j_max]=num[k_max+1];
num[k_max+1]=temp;
for(int i=k_max,j=0;i>j;i--,j++){
int tempo = num[i];
num[i]=num[j];
num[j]=tempo;
}
for (int i = 0; i < n; i++) {
perm += num[i] * (int) Math.pow(10, i);
}
return perm;
}
}
我手动运行了 1,2,..n 的所有排列(n=1 到 4)并得到了正确的结果。对于那些想知道逻辑的人,请参阅here。不显示警告或错误。当提交给在线评委时,它会宣布它是错误的答案(经过 9 次测试)。 [有关链接和结果,请参见下文] 9 个测试必须是与每个测试对应的 n=1 到 9 的所有排列的子集,因此至少我的 4 个测试应该是正确的,但是我的代码没有通过任何测试,请帮我看看没有错误。
编辑:查看 n=4 here 的示例输入输出。下面也添加了
注意:我将“\n”转换为“空格”以解决空间问题
(输入) 4 24 1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
(输出) 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321 4321
编辑:查看结果here。也在这里添加:
问题:NEXTPERM
状态:错误答案
本次投稿总分:0测试用例 #0 获得 2 分 错误的答案 运行时间:0.12
测试用例 #1 获得 2 分 错误的答案 运行时间:0.124
测试用例 #2 获得 2 分 错误的答案 运行时间:0.124
测试用例 #3 获得 2 分 错误的答案 运行时间:0.12
测试用例 #4 获得 2 分 错误的答案 运行时间:0.116
测试用例 #5 获得 2 分 错误的答案 运行时间:0.124
测试用例 #6 获得 2 分 错误的答案 运行时间:0.124
测试用例 #7 获得 2 分 错误的答案 运行时间:0.14
测试用例 #8 获得 2 分 错误的答案 运行时间:0.108
测试用例 #9 获得 2 分 错误的答案 运行时间:0.124
【问题讨论】:
-
我相信这个问题本质上是使用相同的数字集找到下一个更大的数字。看看这个:stackoverflow.com/questions/9368205/…
-
@Sinstein 是的,但是对于大位数的情况会很耗时,请参阅this
-
你只需要处理最多10个数字,你只需要找到下一个排列,而不是
jth排列。从右边开始扫描,对于遇到的每个数字,检查是否存在比其前一组数字中的值更小的数字,如果找到,则交换 2,否则继续下一个数字。这给出了O(n^2)的顺序,这对于n = 1000来说还不错。 -
@Sinstein 不粗鲁,你觉得呢,n=10 会在 3 秒内完成吗?
-
我很确定它会的。此外,提供的链接中的答案在
O(n)中完成了该任务。
标签: java permutation