java - 我如何针对 CyclicShift 优化此 Java 代码(Hackerearth 问题)?

标签 java algorithm

我已经为 Hackerearth 上的循环移位问题编写了一个解决方案。

您可以在 Hackerearth -> Codemonk -> 数组和字符串 -> 循环移位上找到这个问题。

该解决方案为大型测试用例提供了 TLE。我如何优化这段代码。

Java 似乎不能有效地处理字符串。 Python 中的相同代码被接受。

import java.io.*;
import java.util.*;
class TestClass
{


    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while(T-- > 0){
            int N; int K;
            N = sc.nextInt();
            K = sc.nextInt();
            String input = sc.next();
            String B = "";
            String inter = input;
            int d = 0;
            int period = -1;
            for(int i = 0; i < N;i++){
                

                if (B.compareTo(inter) < 0){
                    B = inter;
                    d = i;
                    
                }else if (B.compareTo(inter) == 0){
                    period = i - d;
                    break;
                }
                inter = inter.substring(1, inter.length()) + inter.substring(0, 1);
            }
            if(period == -1){
                System.out.println(d + (K - 1L ) * N);
            }else{
                System.out.println(d + ((K - 1L) * period));
            }
        }


    }
}

我尝试了快速 IO,但没有帮助。

请给我优化的解决方案。

按照马拉卡的建议。以下解决方案确实被接受。

import java.io.*;
import java.util.*;
class TestClass
{

    static int compare(LinkedList<Character> A, LinkedList<Character> B){
        Iterator<Character> i = A.iterator();
        Iterator<Character> j = B.iterator();
        if(A.size() == 0){ return -1;}
        while (i.hasNext()) { // we know they have same length
            char c = i.next();
            char d = j.next();
            if (c < d)
                return -1;
            else if (c > d)
                return 1;
        }
        return 0;
    }

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        while(T-- > 0){
            int N; int K;
            N = sc.nextInt();
            K = sc.nextInt();
            String input = sc.next();
            LinkedList<Character> B = new LinkedList<>();
            
            int d = 0;
            int period = -1;
            LinkedList<Character> inter = new LinkedList<>();
            for(char c: input.toCharArray()){inter.add(c);}

            for(int i = 0; i < N;i++){
                if (compare(B, inter) < 0){
                    B = new LinkedList<>(inter);
                    d = i;
                    
                }else if (compare(B, inter) == 0){
                    period = i - d;
                    break;
                }
                inter.add(inter.removeFirst());
            }
            if(period == -1){
                System.out.println(d + (K - 1L ) * N);
            }else{
                System.out.println(d + ((K - 1L) * period));
            }
        }


    }
}

最佳答案

Java 中的字符串是不可变的。您可以尝试使用LinkedList:

LinkdedList<Character> inter = new LinkedList<>(Arrays.stream(inter)
    .boxed()
    .collect(Collectors.toList()));

或者:

LinkdedList<Character> inter = new LinkedList<>();
for (char c : input.toCharArray())
    inter.add(c);

然后转变变成:

inter.add(inter.removeFirst());

比较可以如下进行:

private int compare(List<Character> a, List<Character> b) {
    Iterator<Character> i = a.iterator();
    Iterator<Character> j = b.iterator();
    while (i.hasNext()) { // we know they have same length
        char c = i.next();
        char d = j.next();
        if (c < d)
            return -1;
        else if (c > d)
            return 1;
    }
    return 0;
}

关于java - 我如何针对 CyclicShift 优化此 Java 代码(Hackerearth 问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69505964/

相关文章:

java - 设置继续按钮以恢复之前的 Activity

java - 在 Windows 上使用 evosuite

algorithm - 这个算法的时间复杂度是多少

algorithm - 使用 Perl 脚本计算目录的距离

c - 如何用 C 创建迷你基准程序

java - 二维数组的流式操作

java - 使用 Apache Lucene 删除磁盘中的所有索引数据/文件?

java - Gradle 在错误的 Maven 位置搜索 Ormlite?

algorithm - 哲学家同步算法

algorithm - 简化大 O 符号