如何解决建议在给定没有旋转步骤的情况下提高阵列旋转的性能
我正在解决黑客地球上的一个问题,该问题是关于具有 x
步旋转的整数数组的右移。下面给出了示例输入、输出:
输入:
测试用例 -- 1
[数组元素个数,旋转步数] -- 5 2
[数组中的元素] -- 1 2 3 4 5
输出:4 5 1 2 3
整个问题陈述可在互联网上获得,标题为 - Monk and Rotation
因此,我的代码在 5 个测试用例中运行良好,但在超过时间限制的情况下失败了 1 个。我尝试更改 scanner
类并使用 bufferedreader
和输入流阅读器来加快输入阅读速度,但仍然没有运气。下面是代码,请提出可以做哪些改进。
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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。