我的程序在大型String上超时,如何使它更快?

约翰

我试图反转一个字符串的元音。我的程序可以运行,但是速度很慢,并且在大型String上超时。我怎样才能使其更快?编写一个将字符串作为输入并仅反转字符串的元音的函数。

示例1:给出s = "hello"return "holle"

示例2:给出s = "leetcode"return "leotcede"

注意:元音不包含字母“ y”。

public class Solution {
    public String reverseVowels(String s){

        Set<Character> vowel = new HashSet<>();

        char [] sArray = s.toCharArray();
        vowel.add('a');
        vowel.add('e');
        vowel.add('o');
        vowel.add('i');
        vowel.add('u');
        vowel.add('A');
        vowel.add('E');
        vowel.add('I');
        vowel.add('O');
        vowel.add('U');

        Stack<Character> v = new Stack<>();
        String temp = "";

        int i = 0;
        for (Character c: sArray){
            if (vowel.contains(c)){
                v.push(c);

            }
            i++;
        }
        for (Character c: sArray){
            if (vowel.contains(c)){
               if (!v.empty())
                c = v.pop();
            }
            temp+= c;

        }
        return temp;

    }
}

编辑:我已经更改了使用StringBuilder的代码,现在它可以通过测试用例,但它仍然比95%的Java解决方案慢,因此,我将进行其他更改以尝试使其更快。我的程序运行缓慢并非完全是由于未使用StringBuilder。即使进行了更改,我的程序仍然非常慢。这不是其他问题的重复。

布林茨卡

这里发生了一些事情:

  1. Set元音的是被重新创建的每一个使用该方法的时间,和元音同样被添加到它的每一个的时间(它也可能涉及扩大集的大小); 因为它们不会改变,所以这不是必需的。(这并没有太大的区别,但我想我会提到它。)

  2. 在您的两个循环中以及将它们添加到元音中时,每个char原语都Character不必要地自动装箱到一个对象中Stack

  3. 正如汤姆(Tom)所链接的可能重复的建议那样,您可能会获得StringBuilder.append(char)+运营商更好的性能

我想尽办法,避免上述缺陷的更好的实现可能看起来像:

private static boolean isVowel(char c) {
    switch (c) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        case 'A':
        case 'E':
        case 'I':
        case 'O':
        case 'U':
            return true;
        default: return false;
    }
}

public static String reverseVowels(String s) {
    final char [] sArray = s.toCharArray();
    final StringBuilder reversedString = new StringBuilder();
    final StringBuilder vowels = new StringBuilder();

    int vowelIndex = -1;
    for (char c : sArray) {
        if (isVowel(c)) {
            vowels.append(c);
            ++vowelIndex;
        }
    }

    for (char c : sArray) {
        if (isVowel(c))
            c = vowels.charAt(vowelIndex--);

        reversedString.append(c);
    }
    return reversedString.toString();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章