在输入反演向量时输出置换

时间:2015-02-18 03:59:29

标签: java arrays

当我输入诸如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];
        }
    }
}

1 个答案:

答案 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

假设您有ArrayListn个号码。我建议使用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

以上是解决方案的关键。由于数组列表已排序,我们希望找到一个只有2a[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:我已经为你的代码提供了一些起点,对你来说应该是一个很好的练习。