【问题标题】:What is the fastest way to compare alternate characters of a string using java?使用java比较字符串的替代字符的最快方法是什么?
【发布时间】:2015-03-22 10:22:08
【问题描述】:

有多个字符串从标准输入传递给这个程序。第一个 int 输入 T,是传递给该程序的测试用例(字符串)的数量。具有不同替代字符的字符串是完美的。如果替代字符相同,则需要删除这两个字符中的 1 个。基本上,您必须计算,需要删除多少个字符才能获得完美的字符串?例如:ABABAB 是完美的,而 AABABAA 并不完美。你需要删除2个A,第一个和最后一个。在AAAA中,你需要删除3个A才能得到一个完美的字符串。字符串输入可能非常大。计算此类删除次数的最快方法是什么?下面的代码是我写的,运行速度很慢。

public static void main(String[] args) {
    Scanner scan = new Scanner (System.in);
    int T= scan.nextInt();
    String str;
    int count=0;
    for(int i=0; i<T; i++){
        str=scan.next();
        for(int j=0; j<str.length()-1; j++){
            if(str.charAt(j)!=str.charAt(j+1)){
                j+=2;
            }
            else{
                count++;
            }
        }
        System.out.println(count);
    }
}

【问题讨论】:

  • 它甚至无法编译
  • @Andremoniy 您好,请立即尝试。它将被编译。
  • 不清楚,第一个 int 输入是什么?
  • 抱歉,第一个int输入T​​,是传递给这个程序的测试用例数。
  • 您一直在编辑源代码,首先发布无法编译的内容,然后发布无法终止的内容,这表明您在此处手动输入代码。请从您编写的程序中复制粘贴工作代码(例如直接从您的 IDE 中)。还要确保代码的缩进反映了代码结构。

标签: java string performance character


【解决方案1】:

在担心性能之前,先考虑一下您的解决方案是否正确。对于输入 ABAAB,您的程序返回 0,但是必须删除 1 A 才能获得完美字符串。

那么:“非常大”是什么意思。那是多少个字符?什么是“非常慢”?

您必须至少查看字符串的每个字符一次,因此您不会变得更快。但是,您也许可以进行一些优化。目前,您可能会看到单个字符两次(一次在str.charAt(j+1) 中,在下一次迭代中在str.charAt(j) 中)。当然可以编写算法,使字符串的每个字符都被访问一次。但同样,您应该先关注正确性,然后再关注速度。

【讨论】:

  • 嘿@Hoopje 谢谢!我的输入大小为 10^10。上述代码部分存在一个逻辑错误。但修正后仍有部分测试用例运行缓慢。
【解决方案2】:

这是我消除所有逻辑错误后的工作代码。对于某些测试用例,它的执行时间可达 0.45-0.50 秒。它的性能可以提高吗?

public static void main(String[] args) {
    int T=0; String str;
    Scanner sc = new Scanner(System.in);
    T=sc.nextInt();
    for(int i=0; i<T; i++){
       str= sc.next();
       solve(str);
    }
}
public static void solve(String str){
    char first, second; int count=0;
    for(int i=0; i<str.length()-1; i++){
       first= str.charAt(i);
       second= str.charAt(i+1);
       if(first==second){
           count++;
       }
    }
    System.out.println(count);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多