提高计划效率

时间:2017-01-15 18:46:01

标签: java performance runtime

public class cowcode {

public static void main(String[] args) {

    long index = 1000000
    String line = HELLO

    boolean found = false;
    if (index <= line.length())
        found = true;

    while (!found) {
        line += buildString(line);
        if (index <= line.length())
            found = true;
    }

    if (found)
        System.out.println("" + charAt(line, index-1));
}

public static String buildString(String str){
    String temp = "" + str.charAt(str.length()-1);

    for (int i = 0; i < str.length()-1; i ++){
        temp += str.charAt(i);
    }
    return temp;
}

public static String charAt(String line, long index){
    for (int i = 0; i < line.length(); i ++){
        if (i == index)
            return line.charAt(i) + "";
    }
    return "";
}
}

喂!上面的代码非常好用。但是唯一的问题是运行时。

这个程序的目标是从“HELLO”构建一个字符串(最终将具有至少大小索引的长度)。这是通过向右旋转字符串(“HELLO” - &gt;“HELLOOHELL”,并将原始字符串和旋转版本连接在一起来完成的。此过程不会停止,直到找到程序正在寻找的索引为止字符串。(所以在这个例子中,经过两次循环后,字符串将变为“HELLOOHELLLHELLOOHEL”)。

你们有没有看到任何可以消除/缩短以改善运行时间的东西?

2 个答案:

答案 0 :(得分:2)

我猜你杀死的是你在buildString中所做的所有String连接。您可以将其缩减至:

public static String buildString(String str){
    return str.charAt(str.length()-1) + str.substring(0, str.length()-1);
}

答案 1 :(得分:1)

您需要在不实际构建字符串的情况下计算索引。它旋转的复合弦的右半部分,左边的没有。如果你在字符串的左半部分有索引,你可以扔掉右半边。因此,您简化了这种情况。如果右半部分有索引,可以将其转换为左半部分的索引。你只需要撤消右半部分的字符串旋转。所以你将索引向左旋转一个字符。现在你可以减去一半字符串的长度,你在字符串的左半部分有索引。上面已经描述了这种情况。所以你缩短字符串并在开头重新开始。最后你最终得到的字符串,没有组成。这是原始字符串。现在您可以直接使用索引来处理字符,因为它现在在字符串的范围内。

index = 1000000 - 1;
line = "HELLO";
int len = line.length();
long len2 = len;
while (len2 <= index) {
    len2 *= 2;
}
while (len2 > len) {
    long lenhalf = len2 / 2;
    if (index >= lenhalf) {
        index -= lenhalf;
        index -= 1;
        if (index < 0) {
            index += lenhalf;
        }
    }
    len2 = lenhalf;
}

System.out.println(line.charAt((int)index));