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”)。
你们有没有看到任何可以消除/缩短以改善运行时间的东西?
答案 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));