减少java中的运行时间

减少java中的运行时间,java,Java,下面的Java代码生成有效的输出,但执行需要更多的时间。代码在eclipse中运行良好,但在像hackerrank或hackerearth这样的在线编译器中不起作用,因为它需要更多的时间来执行。有人帮我找到时间复杂性问题的解决方案 我试图找到问题的解决方案,但无法通过缩短时间来修复性能 Scanner scan = new Scanner(System. in ); String s = "aab"; String s1 = ""; String s2 = ""; int n1 = 0; int

下面的Java代码生成有效的输出,但执行需要更多的时间。代码在eclipse中运行良好,但在像hackerrank或hackerearth这样的在线编译器中不起作用,因为它需要更多的时间来执行。有人帮我找到时间复杂性问题的解决方案

我试图找到问题的解决方案,但无法通过缩短时间来修复性能

Scanner scan = new Scanner(System. in );
String s = "aab";
String s1 = "";
String s2 = "";
int n1 = 0;
int length = 0;
long n = 882787;
long count = 0;
while (s1.length() < n) {
    s1 = s1 + s;

}
if (s1.length() > n) {
    count = s1.length() - n;
    n1 = (int) count;
}

for (int i = 0; i < s1.length() - n1; i++) {
    if (s1.charAt(i) == 'a') {
        length += 1;
    }
}
System.out.println(length);
上述计划的说明: 我有一个用小写英文字母表示的字符串s,我重复了n次,并将其存储在新字符串中。 我必须找到新字符串中出现“a”的次数

如何实际降低上述程序的时间复杂度


提前感谢

我将使用正则表达式根据仅包含字母“a”的初始输入创建字符串。取那个字符串的长度乘以n。这是一条看起来像

System.out.println(s.replaceAll("[^a]+", "").length() * n);

字符串是不可变的。对字符串的修改实际上是创建一个新的字符串对象,并将旧字符串和新字符串放入

如果您不想更改算法,我建议使用StringBuilder来提高执行速度。请注意,StringBuilder不是线程安全的

String s="aab";
int n1 = 0;
StringBuilder sb1 = new StringBuilder();
int length=0;
long n=882787;
long count=0;

while(sb1.length() < n) {
    sb1.append(s);
}
if(sb1.length()>n) {
    count =sb1.length()-n;
    n1=(int)count;
}

for(int i=0;i<sb1.length()- n1;i++) {
    if(sb1.charAt(i)=='a') {
        length+=1;
    }
}
System.out.println(length);

何时使用哪一种:

如果字符串在整个程序中保持不变,则 使用字符串类对象,因为字符串对象是不可变的。如果 字符串可以更改示例:在 字符串的构造,并且只能从单个 线程,使用StringBuilder就足够了。如果字符串可以更改, 将从多个线程访问,请使用StringBuffer,因为 StringBuffer是同步的,因此具有线程安全性


我看到了多种可能的优化:

一个不太好的模式是通过重复的字符串连接创建大量字符串。每个s1=s1+s;创建字符串的新实例,该实例将在下次运行该命令时被废弃,这会增加负载,因为字符串实例将是垃圾收集器的额外工作

一般来说:如果你发现你的算法耗时太长,那么你应该考虑一种全新的方法来解决这个问题。因此,另一种解决方案可能是: -你知道你想要的长度n和用来创建大字符串的小字符串s1的长度。因此,您可以计算:小字符串在目标字符串中的频率是多少?还剩多少个字符? ==>您只需在小字符串中检查要查找的字符即可。乘以小字符串在大字符串中出现的频率是得到的第一个结果。 ==>现在需要检查缺少的小字符串的子字符串

示例:n=10,s1=aab,正在查找: 因此,首先我们检查s1多长时间可以放入一个由n个字符组成的新字符串n/lengths1=>3 所以我们检查a在aab->2内的频率 第一个结果是3*2=6 但是到目前为止我们检查了3*3=9个字符,但是我们想要10个字符。所以我们需要检查s1的n%lengths1=1个字符,在这个子字符串a中,我们有1个a,所以我们必须加1。 所以结果是7,我们没有建立一个大字符串,这是完全不需要的

要将s添加到字符串n/s中。长度乘以,称为n:

int N = n / s.length();
每次向字符串中添加s时,都要在s中添加As的数量:


只需检查字符在原始文件中出现的次数,并将其乘以n即可。下面是一种不使用正则表达式的简单方法:

// take these as function input or w/e    
String s = "aab";
String find = "a";
long n = 882787;

int count = s.length() - s.replaceAll(find, "").length();
System.out.println(count * n);

考虑运行一个分析器,看看时间是如何花的。你可以检查你的字符串一次有多少个字符,只是把它乘以你必须记录单词的次数。想想IHI先生,假设我的N是10,而我的字符串S是ABA。我必须将字符串添加到n,然后我的新字符串s1='abaa'。'a'的出现总数是7。但是您的解决方案给出了6@karthikeyanGuna好吧,好吧。。。你能想到如何利用这种方法得到正确的答案吗?
int length = a * N;
// take these as function input or w/e    
String s = "aab";
String find = "a";
long n = 882787;

int count = s.length() - s.replaceAll(find, "").length();
System.out.println(count * n);