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

由于大量输入的黑客等级超时而终止

宫晟
2023-03-14

这段代码在Hackerrank上的一些大输入上显示“Terminated due to timeout”(因超时而终止)错误,但在其余情况下仍能正常工作。请帮助我改进此代码。

约翰·沃森在整数数组上执行一个称为右圆旋转的操作。执行一次右圆旋转操作后,数组将从 转换为 。

Watson多次执行此操作。为了测试Sherlock识别旋转数组中特定位置的当前元素的能力,Watson请求查询,其中每个查询由一个整数组成,您必须为此打印旋转数组中索引处的元素(即的值)。

输入格式

第一行分别包含空格分隔的整数、、和。第二行包含空格分隔的整数,其中每个整数描述数组元素(where)。随后的每一行都包含一个表示的整数。

约束条件

输出格式

对于每个查询,在新行上打印旋转数组索引处的元素值。

示例输入

3 2 3 1 2 3 0 1 2 采样输出

2 3 1

我的代码

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        int n,k,q,temp=0,c=0;
        Scanner sc=new Scanner(System.in);
        try{
        n=sc.nextInt();
        k=sc.nextInt();
        q=sc.nextInt();
        int[] arr=new int[n];
        int qrr[]=new int[q];
        for(int i=0;i<n;i++)
            arr[i]=sc.nextInt();
        while(sc.hasNext()){
            qrr[c++]=sc.nextInt();
        }
        for(int j=1;j<=k;j++){
        temp=arr[n-1];
        for(int i=n-2;i>=0;i--){
            arr[i+1]=arr[i];
        }
        arr[0]=temp;
        }
        for(int i=0;i<q;i++){
            System.out.println(arr[qrr[i]]);
        }
    }
    catch(Exception ae){
        System.out.println(ae.getMessage());
    }
}
}

共有1个答案

湛钊
2023-03-14
import java.io.*;
import java.util.*;

public class Solution {

    public static int m,n,k,q,i=0,c=0;
    public static int errorflag = 0;
    public static int array[];
    public static int rotated[];
    public static Scanner in = new Scanner(System.in);

    public static int[] getArray(int n){
        array = new int[n];
        for(i=0;i<n;i++){
            array[i] = in.nextInt();
        }       
        return(array);
    }

    public static int[] rotate(int[] original){
        int[] rotated = new int[original.length];
        for(i=0;i<original.length;i++){
            rotated[(i+k)%original.length] = original[i];
        }
        return(rotated);
    }

上面的函数工作在最坏的情况下O(n)复杂度。基本上,您正在做的是为元素分配一个新索引,这样它们就可以右旋转或递增k,溢出由模运算处理。

    public static void main(String[] args) {
        n = in.nextInt();
        k = in.nextInt();
        q = in.nextInt();
        array = getArray(n);

        int m[] = new int[q];
        for(i=0;i<m.length;i++){
            m[i] = in.nextInt();
        }
        rotated = rotate(array);
        for(i=0;i<m.length;i++){
            System.out.println(rotated[m[i]]);
        }


    }
}
 类似资料:
  • 大家好,请检查问题黑客排名问题陈述 这是我对上述问题的解决方案(链接) 当数组大小较大时,我的代码无法处理,例如数组中的17623个元素。 由于超时而终止 问题出在第二个for循环中,该循环遍历数组并给出数组中最大数字的索引。还有其他方法可以提高性能吗。

  • 我试图解决hackerrank的一个问题,当我提交我的解决方案时,我得到一个错误,说明“由于超时而终止”。 请检查代码,并建议我如何优化。 语句:您有一个空序列,将向您提供查询。每个查询都是以下三种类型之一: 1 x-将元素x推入堆栈。2-删除堆栈顶部的元素。3-打印堆栈中的最大元素。 输入格式 输入的第一行包含一个整数。接下来的每一行都包含上述查询。(保证每个查询都是有效的。) 输出格式 对于每

  • 问题是-合并两个排序的链表。有关详细信息,请访问https://www.hackerrank.com/challenges/merge-two-sorted-linked-lists当我在网站上提交此内容时,它显示“因超时而终止”。请告诉我代码有什么问题,以及如何修复它。 }

  • 输入格式 第一行包含两个空格分隔的整数,分别表示n(整数的个数)和d(您必须执行的左旋转个数)的值。第二行包含n个空格分隔的整数,描述数组初始状态的各个元素。 约束 1<=n<=10^5 1<=d<=n 1<=ai<=10^6 示例输出 当我们执行d=4次左旋转时,数组将经历以下变化顺序: [1,2,3,4,5]-->[2,3,4,5,1]-->[3,4,5,1,2]-->[4,5,1,2]-->

  • 关于这个话题有很多讨论。我看了一遍,但没有一个有用。 问题似乎相当简单: 如果我们列出10以下的所有自然数,它们是3或5的倍数,我们得到3、5、6和9。这些倍数之和是23。 求N以下3或5的所有倍数之和。 输入格式第一行包含表示测试用例数量的T。接下来是T行,每一行包含一个整数N。 输出格式对于每个测试用例,打印一个整数,表示N以下3或5的所有倍数之和。 约束1≤T≤10^5 1≤N≤10^9 然

  • 我在google cloud中创建了一个google cloud函数,它将连接到我在google cloud中创建的postgresql实例。 我正在使用'pg'节点模块。 我已经为此创建了一个私有IP。 我收到以下错误: 错误:由于在timeout.ConnectionTimeouthAndle.SetTimeout(/workspace/node_modules/pg/lib/client.j