当我输入诸如X = [5 0 1 1 1 2]
之类的内容时,我需要知道如何打印排列,其中5 = n
也就是数组中跟随的整数数。输出很简单,它是J = [5 1 2 4 3]
。这是通过从2开始读取X得到的.N(1-5)中有3个数字大于2.所以J[5]
现在是3.然后将X移动到2之前的1,那里是前面的(1-5) - (3(前面获得))中的1个数字大于J[4]
所以J[4] = 4
。如果由于我的解释没有意义,这可能会有所帮助,当3被删除时它现在是1 2 4 5.所以如果只有1个元素比它自己大,那么它必须是元素4因为只有5是大。到目前为止,我有这个,我在编写一些看似简单的东西时感到困惑。
public static void main(String[] args) {
int i;
int j;
Scanner input = new Scanner(System.in);
int nums = input.nextInt();
if (nums < 1 || nums > 1000) {
input.close();
} else {
for (int counter = 0; counter < nums; counter++) {
int[] a = new int[nums];
int[] w = new int[nums];
}
}
}
答案 0 :(得分:0)
我将就如何解决这个问题给你一个方法。
所以您收到此表单的输入:
X = [5 0 1 1 1 2];
//5 signifies list of numbers [1,2,3,4,5]
//And the rest of the array i.e. X[1] to X[4] gives us a permutation
假设您有ArrayList个n
个号码。我建议使用arraylist因为我发现使用它们更容易,因为我们必须在这里删除元素。
所以最初arraylist有以下内容(确保按递增顺序输入元素):
foo = {1,2,3,4,5}; //Assuming the array list is called foo
//The permutation array is [0,1,1,1,2] in your case
//Start traversing it backwards, you can do that with a simple loop
//So given the array a = [0,1,1,1,2], you start with a[4]
a[4] = 2;
//This implies the number you are looking for is at the 3rd last position of the array list
以上是解决方案的关键。由于数组列表已排序,我们希望找到一个只有2
或a[4]
个数字的数字。它非常简单地从5,4开始倒数,直到我们到达第3个元素为3.然后你删除那个元素并继续下一次迭代。
简单地说:
l = foo.size(); //Length of array list initialized before the loop
//If you have a loop starting from i=4 to 0 for the array [0,1,1,1,2]
//At any i, you do:
index = l - a[i];
System.out.print(foo.get(index));
//This would ultimately output 3 4 2 1 5 in your case
foo.remove(index); //Remove the element at this index from arraylist
l = l-1; //Since at every iteration we will remove one element
本质上,它只是使用置换来在排序的arraylist中找到元素的正确索引并将其删除并继续迭代。我希望我能够清楚地解释自己,这会让你开始朝着正确的方向前进。
PS:我已经为你的代码提供了一些起点,对你来说应该是一个很好的练习。