当前位置: 首页 > 知识库问答 >
问题:

如何减少编译时间以及这些代码在哪些情况下会失败

姚星河
2023-03-14

问题-
蒙克喜欢在数组上预制不同的操作,因此作为哈克地球学校的校长,他给他的新学生米什基布置了一个任务。Mishki将被提供一个大小为N的整数数组A和一个整数K,在这里她需要将数组向正确的方向旋转K步,然后打印结果数组。由于她是新来的,请帮助她完成任务。
输入:
第一行将由一个表示测试用例数的整数T组成。对于每个测试用例:

  1. 第一行由两个整数N和K组成,N是数组中的元素数,K表示旋转的步数。
  2. 下一行由N个空格分隔的整数组成,表示数组a的元素。
    它失败了一些测试用例,我不知道是哪一个,也不知道如何减少时间复杂度。
    这是我的代码,我做了所有的研究,我可以做的。也请给出简单的解决办法,因为我是一个初学者。
    Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();

        for (int i = 0; i < t; i++) {

            int n = sc.nextInt();
            int k = sc.nextInt();
            int v[] = new int[n];

            for (int j = 0; j < n; j++) {
                v[j] = sc.nextInt();
            }

            for (int m = 1; m <= k; m++) {
                int temp = v[n - 1];
                for (int p = 1; p < n; p++) {

                    v[n - p] = v[n - (p + 1)];

                }
                v[0] = temp;

            }
            for (int a : v) {
                System.out.print(a + " ");
            }

        }

共有1个答案

谭飞掣
2023-03-14

我不确定我是否理解代码,但你发布的东西,据我所知是有效的。

我对它进行了重构,使其更易于消化--更好的命名,将大量部分提取到方法中,消除了对扫描器的需要,这样我就可以针对“Rotate”方法运行一堆我自己的测试用例,以检查输入与预期输出。

import java.util.Arrays;

public class Application {

    public void run(int testCases, int arraySize, int rotations, String[] arrayElements) {
        for (int i = 0; i < testCases; i++) {
            getRotatedArray(arraySize, rotations, arrayElements);
        }
    }

    public int[] getRotatedArray(int arraySize, int rotationXTimes, String[] arrayElements) {
        int[] a = new int[arraySize];
        populateIntArray(arrayElements, a);
        rotateArray(rotationXTimes, a);
        Arrays.toString(a);
        return a;
    }

    private void rotateArray(int rotations, int[] array) {
        for (int m = 1; m <= rotations; m++) {
            // get last item of array...
            int length = array.length;
            int temp = array[length - 1];
            // shift elements 1 position right
            for (int p = 1; p < length; p++) {
                array[length - p] = array[length - (p + 1)];
            }
            // first  element becomes last.
            array[0] = temp;
        }
    }

    private int[] populateIntArray(String[] arrayElements, int[] array) {
        for (int j = 0; j < arrayElements.length; j++) {
            array[j] = Integer.parseInt(arrayElements[j]);
        }
        return array;
    }
}

某些测试:

import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;

public class ApplicationTest {

    private Application app;

    @Before
    public void setUp()  {
        app = new Application();
    }

    @Test
    public void test1() {
        int[] result = app.getRotatedArray(0 , 0, new String[]{});

        assertEquals(0, result.length);
    }

    @Test
    public void test2() {
        int[] result = app.getRotatedArray(1 , 0, new String[]{"0"});

        assertEquals(1, result.length);
        assertArrayEquals(new int[]{0}, result);
    }

    @Test
    public void test3() {
        int[] result = app.getRotatedArray(1 , 1, new String[]{"0"});

        assertEquals(1, result.length);
        assertArrayEquals(new int[]{0}, result);
    }

    @Test
    public void test4() {
        int[] result = app.getRotatedArray(1 , 2, new String[]{"0"});

        assertEquals(1, result.length);
        assertArrayEquals(new int[]{0}, result);
    }

    @Test
    public void test5() {
        int[] result = app.getRotatedArray(2 , 0, new String[]{"0","1"});

        assertEquals(2, result.length);
        assertArrayEquals(new int[]{0,1}, result);
    }

    @Test
    public void test6() {
        int[] result = app.getRotatedArray(2 , 1, new String[]{"0","1"});

        assertEquals(2, result.length);
        assertArrayEquals(new int[]{1,0}, result);
    }

    @Test
    public void test7() {
        int[] result = app.getRotatedArray(2 , 2, new String[]{"0","1"});

        assertEquals(2, result.length);
        assertArrayEquals(new int[]{0,1}, result);
    }

    @Test
    public void test8() {
        int[] result = app.getRotatedArray(3 , 0, new String[]{"0","1","2"});

        assertEquals(3, result.length);
        assertArrayEquals(new int[]{0,1,2}, result);
    }

    @Test
    public void test9() {
        int[] result = app.getRotatedArray(3 , 1, new String[]{"0","1","2"});

        assertEquals(3, result.length);
        assertArrayEquals(new int[]{2,0,1}, result);
    }

    @Test
    public void test10() {
        int[] result = app.getRotatedArray(3 , 2, new String[]{"0","1","2"});

        assertEquals(3, result.length);
        assertArrayEquals(new int[]{1,2,0}, result);
    }

    @Test
    public void test11() {
        int[] result = app.getRotatedArray(3 , 3, new String[]{"0","1","2"});

        assertEquals(3, result.length);
        assertArrayEquals(new int[]{0,1,2}, result);
    }

    @Test
    public void test12() {
        int[] result = app.getRotatedArray(4 , 0, new String[]{"0","1","2","3"});

        assertEquals(4, result.length);
        assertArrayEquals(new int[]{0,1,2,3}, result);
    }

    @Test
    public void test13() {
        int[] result = app.getRotatedArray(4 , 4, new String[]{"0","1","2","3"});

        assertEquals(4, result.length);
        assertArrayEquals(new int[]{0,1,2,3}, result);
    }
}

所有测试都通过了。

如果您阅读了测试,您应该能够看到我提供了一些输入,执行了一个特定的方法(执行了一些过程),并根据我的期望检查输出。

即,我正在测试getRotatedArray是否能够按照预期工作。确实如此。

当您说它坏了而不知道在哪里时,我建议添加一些system.out.println语句,这样您就可以验证应用程序正在执行您认为的操作。

 类似资料:
  • 我写了如下界面: 和以下类 您可以看到,中的my是一个,而接口是一个字符串类型。我本以为是编译器错误,但这是如何工作的呢?

  • 我正试图减少gwt项目的编译时间,使用maven概要文件来设置是需要所有排列还是只需要其中的一部分。 我按照教程在这里:http://www.bonitasoft.org/blog/tutorial/speed-up-gwt-i18n-compilation-using-maven-profiles/ 但是,它没有说明如何创建这两个模块(生产和开发)。这些都是应用程序。gwt。xml文件,如果是,

  • null 有人能解释一下目标代码和机器代码这两个概念之间的区别吗?这些是在哪些情况下产生的?

  • 我的问题与这一声明有关: 立即释放此语句对象的数据库和JDBC资源,而不是等到它自动关闭时才释放。http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html#close() 那么,在哪些情况下语句对象会自动关闭?

  • 问题内容: 我知道AngularJS在ng-repeat上设置了一些监视。此时设置了哪种手表? 另外,有人可以解释在每种情况下会发生什么吗?我想知道我有很多物品,所以如果我用其他方式写的话,不会被那些本可以淘汰的手表所困扰。 之一 二 三 四个 问题答案: 每个人都会在上设置一个$ watch 。(如果您查看ng- repeat源代码 ,则其中大多数是$ watch方法的watchExpressi

  • 远程类加载是指加载未在执行位置显示的类。 例如,JavaApplet需要将类从服务器加载到本地并在本地执行。 一些包含URLClassLoader的程序需要从网络加载类,并在本地执行。 RMI怎么样?我找到了一个名为RMIClassLoader的类?是远程类加载吗?