java - 如何减少编译时间以及此代码在哪些情况下会失败
问题描述
问题
- Monk 喜欢对数组执行不同的操作,因此作为 Hackerearth 学校的校长,他给他的新学生 Mishki 分配了一项任务。Mishki 将获得一个大小为 N 的整数数组 A 和一个整数 K ,她需要将数组沿正确方向旋转 K 步,然后打印结果数组。由于她是新来的学校,请帮助她完成任务。
输入:
第一行由一个整数 T 组成,表示测试用例的数量。对于每个测试用例:
- 第一行由两个整数 N 和 K 组成,N 是数组中元素的数量,K 表示旋转的步数。
- 下一行由 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 + " ");
}
}
解决方案
我不确定我是否理解代码,但据我所知,您发布的内容有效。
我对它进行了重构以使其更易于消化——更好的命名、提取到方法的许多部分、消除了对扫描仪的需求,因此我可以针对“旋转”方法运行一堆我自己的测试用例来检查输入与预期输出。
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
语句,以便您可以验证应用程序正在执行您认为它正在执行的操作。
推荐阅读
- excel - 复制行并减少 ID
- python - 如何从多个 CSV 文件的字段中获取数据类型?
- javascript - 是否有 ngTemplateOutlet 的 vue.js 等价物?
- android - AndroidX下如何使用FirebaseRecyclerAdapter?
- python - 数据类子类不继承 __repr__
- node.js - REST API单元测试,在nodejs中返回承诺
- r - 有没有办法读取 Rda 文件的样本?
- machine-learning - 垃圾邮件分类器 Clojure
- python - 在 Python 中将目录视为文件
- javascript - 为什么 javascript 不接受异步调用(async/await)?