Java 旋转阵列的程序;它';s投掷时间限制是否超过(TLE)?如何使用BufferedReader进行优化和进一步修复?

Java 旋转阵列的程序;它';s投掷时间限制是否超过(TLE)?如何使用BufferedReader进行优化和进一步修复?,java,arrays,Java,Arrays,给定大小为N的未排序数组arr[],将其旋转D个元素(顺时针) 输入: 输入的第一行包含表示测试用例数量的T。每个测试用例的第一行包含两个空格分隔的元素,N表示数组的大小,整数D表示旋转的数字大小。下一行将是N个空格分隔的数组元素 输出: 对于每个测试用例,在新行中输出旋转的数组 限制条件: 1 <= T <= 200 1 <= N <= 107 1 <= D <= N 0 <= arr[i] <= 105 输出: 3 4 5 1 2 8 10

给定大小为N的未排序数组arr[],将其旋转D个元素(顺时针)

输入:

输入的第一行包含表示测试用例数量的T。每个测试用例的第一行包含两个空格分隔的元素,N表示数组的大小,整数D表示旋转的数字大小。下一行将是N个空格分隔的数组元素

输出:

对于每个测试用例,在新行中输出旋转的数组

限制条件:

1 <= T <= 200
1 <= N <= 107
1 <= D <= N
0 <= arr[i] <= 105
输出:

3 4 5 1 2
8 10 12 14 16 18 20 2 4 6
说明:

Testcase 1: 1 2 3 4 5  when rotated by 2 elements, it becomes 3 4 5 1 2.
我已经使用Scanner类编写了相同的代码,但是它超出了时间限制

1. I need a better solution.
2. I read here that BufferedReader helps avoid TLE
3. I tried using it; but when i take input it throws NumberFormatException.
这是我的代码:(使用Scanner类)


BufferedReader将整行作为输入,当您将其作为“52”输入时,它会尝试将其解析为整数。现在问题来了。我建议使用StringTokenizer和BufferedReader来克服这个问题

while(t-->0){
   StringTokenizer st = new StringTokenizer(br.readLine());
   int s = Integer.parseInt(st.nextToken());
   int k = Integer.parseInt(st.nextToken());
   // to take new line in input
   StringTokenizer arrInput = new StringTokenizer(br.readLine());
   int[] arr = new int[s];
   for(int i=0;i<s;i++){
       arr[i] = Integer.parseInt(arrInput.nextToken());
   }
   int[] answer = new int[s];

   for(int j=0; j<s;j++){
       answer[(j-k+s)%s]=arr[j];
   }
   for(int j=0;j<s;j++){
       arr[j] = answer[j];
   }
}
//all you need to do is print your arr array.
while(t-->0){
StringTokenizer st=新的StringTokenizer(br.readLine());
ints=Integer.parseInt(st.nextToken());
int k=Integer.parseInt(st.nextToken());
//输入新行
StringTokenizer arrInput=新的StringTokenizer(br.readLine());
int[]arr=新的int[s];

对于(int i=0;i我想知道为什么要使用
Scanner
旋转数组?!要旋转数组(左或右),可以使用以下技巧

ABCDEFG -> FGABCDE

1. GFEDCBA -> rotate A...G
2. FGEDCBA -> rotate G...F
3. FGABCDE -> rotate E...A
代码

private static void leftRotate(int[] a, int k) {
    k = k >= a.length ? a.length % k : k;

    for (int i = 0, j = a.length - 1; i < j; i++, j--)
        swap(a, i, j);
    for (int i = 0, j = a.length - k - 1; i < j; i++, j--)
        swap(a, i, j);
    for (int i = a.length - k, j = a.length - 1; i < j; i++, j--)
        swap(a, i, j);
}

private static void swap(int[] a, int i, int j) {
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
private static void leftRotate(int[]a,int k){
k=k>=a.length?a.length%k:k;
对于(inti=0,j=a.length-1;i
int测试用例;
int n=10;
int旋转_数组=3;
int arr[]={2,4,6,8,10,12,14,16,18,20};

对于(int i=0;i解决方案

import java.util.*;
导入java.lang.*;
导入java.io.*;
类主{
/*在这里,我们定义了向左旋转的函数arr[]的大小为n×d是旋转数*/
void leftRotate(int arr[],int d,int n)
{ 
对于(int i=0;i对于(int k=0;kI)不要认为你的TLE与
扫描仪
有任何关系。你将数组旋转1个元素
D
次,时间复杂度为
O(ND)
,这不是最有效的方法…@ImpershableNight谢谢你指出这一点;我会尝试想出更好的方法。@ImpershableNight我也像使用Scanner一样使用BufferedReader获取输入;你能帮我解决吗?不要在这里使用3LAs,除非它们非常常用。你能更详细一点吗清楚吗?@user207421我也尝试过使用StringTokenizer解决这个问题;在rotat.main(File.java:19)的java.util.StringTokenizer.nextToken(StringTokenizer.java:349)处的线程“main”java.util.NoSuchElementException中抛出运行时错误:Runtime ErrorException第19行:我在哪里获取数组输入。你能在你的问题中发布该代码吗?或者使用gfg ide共享它吗?我在回答中犯了一个愚蠢的错误。它应该是arrayInput.nextToken().现在应该可以了。是的,明白了。这是我的错。一定要让我知道它现在能不能工作。谢谢你,但仍然会抛出TLE;需要优化我的代码。
Runtime ErrorException in thread "main" java.lang.NumberFormatException: For input string: "5 2" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)
    at GFG.main(File.java:13)
while(t-->0){
   StringTokenizer st = new StringTokenizer(br.readLine());
   int s = Integer.parseInt(st.nextToken());
   int k = Integer.parseInt(st.nextToken());
   // to take new line in input
   StringTokenizer arrInput = new StringTokenizer(br.readLine());
   int[] arr = new int[s];
   for(int i=0;i<s;i++){
       arr[i] = Integer.parseInt(arrInput.nextToken());
   }
   int[] answer = new int[s];

   for(int j=0; j<s;j++){
       answer[(j-k+s)%s]=arr[j];
   }
   for(int j=0;j<s;j++){
       arr[j] = answer[j];
   }
}
//all you need to do is print your arr array.
ABCDEFG -> FGABCDE

1. GFEDCBA -> rotate A...G
2. FGEDCBA -> rotate G...F
3. FGABCDE -> rotate E...A
private static void leftRotate(int[] a, int k) {
    k = k >= a.length ? a.length % k : k;

    for (int i = 0, j = a.length - 1; i < j; i++, j--)
        swap(a, i, j);
    for (int i = 0, j = a.length - k - 1; i < j; i++, j--)
        swap(a, i, j);
    for (int i = a.length - k, j = a.length - 1; i < j; i++, j--)
        swap(a, i, j);
}

private static void swap(int[] a, int i, int j) {
    int tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
I have a solution for c++, not totally implemented!
    int test_case ;
    int n = 10 ;
    int rotate_array = 3 ;
    int arr[] = {2, 4 ,6 ,8, 10, 12, 14, 16, 18, 20};
    for (int i = 0 ; i <= n ; i ++ ){
        if(i <= rotate_array) {
            arr[n + i] = arr[i];
        }
    }
    for (int i = 0 ; i < n ; i ++ ){
        arr[i] = arr[rotate_array + i];
    }