建议在给定旋转步数的情况下改进阵列旋转的性能
Suggest performance improvement for rotation of array with given no of steps of rotation
我正在解决 hacker-earth 上的一个问题,该问题是关于 右移 整数数组 x
旋转步长的。下面给出的是示例输入,输出:
输入:
测试用例 -- 1
[数组元素个数,旋转步数] -- 5 2
[数组中的元素] -- 1 2 3 4 5
输出:
4 5 1 2 3
整个问题陈述都可以在 Internet 上找到,标题为 - Monk and Rotation
因此,我的代码在 5 个测试用例中运行良好,但在超过时间限制的情况下,1 个测试用例失败。我尝试更改 scanner
class 并使用 bufferedreader
和输入流 reader 以加快输入读取速度,但仍然没有成功。下面是代码,请提出可以做哪些改进。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.io.*;
class TestClass {
public static void main(String args[] ) throws Exception {
int noOfElements,stepsOfRotation;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCases = Integer.parseInt(br.readLine());
while(testCases!=0)
{
String firstLine=br.readLine();
String[] parts=firstLine.split(" ");
noOfElements=Integer.parseInt(parts[0]);
stepsOfRotation=Integer.parseInt(parts[1]);
int[] arr=new int[noOfElements];
String secondLine=br.readLine();
String[] arrayElements=secondLine.split(" ");
for(int i=0;i<noOfElements;i++)
{
arr[i]=Integer.parseInt(arrayElements[i]);
}
stepsOfRotation %= noOfElements;
int result;
for(int i=0;i<noOfElements;i++)
{
result=arr[(i+(noOfElements-stepsOfRotation))%noOfElements];
System.out.print(result+" ");
}
System.out.println();
testCases--;
}
}
}
最后一个p
不应该是result
吗?
请让 IDE 格式化代码。并尽可能在第一次使用时声明变量。
代码本身没问题,虽然有点贵split
。
没有字符串数组也行:
int pos = 0;
for (int i=0; i<noOfElements; i++) {
int pos2 = firstLine.indexOf(' ', pos);
if (pos2 == -1) {
pos2 = firstLine.length();
}
arr[i] = Integer.parseInt(firstLine.substring(pos, pos2);
pos = pos2 + 1;
}
我建议您开始使用 StringTokenizer
作为数组输入,使用 StringBuilder
来打印所有此类编码问题的输出。
这里我们有一个大的数据集作为输入和输出,所以总是建议使用上面的方法,因为 print
调用的次数越多,你的程序就越慢。
声明:
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder("");
而不是打印每个元素,而是将它们附加到 StringBuilder sb
。
for(int i=0;i<noOfElements;i++)
{
result=arr[(i+(noOfElements-stepsOfRotation))%noOfElements];
sb.append(result).append(" ");
}
sb.append("\n");
testCases--;
}
System.out.print(sb);
如果您不知道如何使用它们,请阅读 StringTokenizer
。
我正在解决 hacker-earth 上的一个问题,该问题是关于 右移 整数数组 x
旋转步长的。下面给出的是示例输入,输出:
输入:
测试用例 -- 1
[数组元素个数,旋转步数] -- 5 2
[数组中的元素] -- 1 2 3 4 5
输出:
4 5 1 2 3
整个问题陈述都可以在 Internet 上找到,标题为 - Monk and Rotation
因此,我的代码在 5 个测试用例中运行良好,但在超过时间限制的情况下,1 个测试用例失败。我尝试更改 scanner
class 并使用 bufferedreader
和输入流 reader 以加快输入读取速度,但仍然没有成功。下面是代码,请提出可以做哪些改进。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
import java.io.*;
class TestClass {
public static void main(String args[] ) throws Exception {
int noOfElements,stepsOfRotation;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCases = Integer.parseInt(br.readLine());
while(testCases!=0)
{
String firstLine=br.readLine();
String[] parts=firstLine.split(" ");
noOfElements=Integer.parseInt(parts[0]);
stepsOfRotation=Integer.parseInt(parts[1]);
int[] arr=new int[noOfElements];
String secondLine=br.readLine();
String[] arrayElements=secondLine.split(" ");
for(int i=0;i<noOfElements;i++)
{
arr[i]=Integer.parseInt(arrayElements[i]);
}
stepsOfRotation %= noOfElements;
int result;
for(int i=0;i<noOfElements;i++)
{
result=arr[(i+(noOfElements-stepsOfRotation))%noOfElements];
System.out.print(result+" ");
}
System.out.println();
testCases--;
}
}
}
最后一个p
不应该是result
吗?
请让 IDE 格式化代码。并尽可能在第一次使用时声明变量。
代码本身没问题,虽然有点贵split
。
没有字符串数组也行:
int pos = 0;
for (int i=0; i<noOfElements; i++) {
int pos2 = firstLine.indexOf(' ', pos);
if (pos2 == -1) {
pos2 = firstLine.length();
}
arr[i] = Integer.parseInt(firstLine.substring(pos, pos2);
pos = pos2 + 1;
}
我建议您开始使用 StringTokenizer
作为数组输入,使用 StringBuilder
来打印所有此类编码问题的输出。
这里我们有一个大的数据集作为输入和输出,所以总是建议使用上面的方法,因为 print
调用的次数越多,你的程序就越慢。
声明:
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder("");
而不是打印每个元素,而是将它们附加到 StringBuilder sb
。
for(int i=0;i<noOfElements;i++)
{
result=arr[(i+(noOfElements-stepsOfRotation))%noOfElements];
sb.append(result).append(" ");
}
sb.append("\n");
testCases--;
}
System.out.print(sb);
如果您不知道如何使用它们,请阅读 StringTokenizer
。