【问题标题】:Are the following two "Swap Vowels in a String" solutions computationally equivalent?以下两个“交换字符串中的元音”解决方案在计算上是否等效?
【发布时间】:2016-01-21 02:52:52
【问题描述】:

我想知道“交换字符串中的元音”问题的以下两种解决方案在计算上是否等效(时间复杂度和内存)。

解决方案 1(带有条件嵌套 for 的主 for 循环):

package practiceQuestions.p1;

    import java.util.HashSet;

    public class Solution {

        public static char[] solve (String text) {
            HashSet vowelSet = new HashSet();
            char[] vowels = {'a','e','i','o','u','A','E','I','O','U'};

            for (char v : vowels) {
                vowelSet.add(v);
            }

            char[] asCharArray = text.toCharArray();
            int lastStop = asCharArray.length;

            for (int i = 0; i < lastStop; i++) {
                if(vowelSet.contains(asCharArray[i])) {
                    for (int j = lastStop - 1; j > i; j--) {
                        if(vowelSet.contains(asCharArray[j])) {
                            char temp = asCharArray[j];
                            asCharArray[j] = asCharArray[i];
                            asCharArray[i] = temp;

                            lastStop = j;
                            break;
                        }
                    }
                }
            }

            return asCharArray;
        }

        public static void main(String[] args) {
            String someText = "swap my vowels";
            System.out.println(Solution.solve(someText));
        }

    }

解决方案2(我没有代码,但这里是解释):

有一个主要的while 循环,它从字符串的两端开始,并将所有元音存储在hashmap 中,整数作为键,字符作为值。然后,根据每个值的位置(键),该函数将交换所有元音字符(值)。

上面提到的两者在计算上是等价的吗?我确信解决方案 2 对内存的任务更多,但我不确定时间复杂度。我猜解决方案 1 会稍微快一些。

【问题讨论】:

    标签: java performance memory time


    【解决方案1】:

    这不会非常严格,但我相信它应该成立。 其中 n 是输入字符串的长度,我们正在考虑整个字符串是元音的最坏情况......

    方法一
    时间:n*(交换时间)+ 常量
    您嵌套的部分循环会形成一个完整的循环。
    空格:n + 常量
    您只存储输入字符串、元音字典和一些计数器/交换变量

    方法二
    时间:n*(插入 hashmap 的时间)+ n*(查找和交换的时间)+ 常量
    你在这个中做的计算比另一个要多。您正在计算哈希码并插入一个元素,而不是三个操作交换。然后,您进行实际替换。
    空格:(n 的一些倍数)+ 常量
    除了方法 1 所需的空间外,散列图还会为每个元素占用一些额外空间。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 2020-12-03
      • 2016-10-29
      相关资源
      最近更新 更多