【问题标题】:jumbledString: Given a string s and a number n, write a function that concatenates the even-indexed chars to the frontjumbledString:给定一个字符串 s 和一个数字 n,编写一个函数,将偶数索引字符连接到前面
【发布时间】:2021-07-22 12:42:15
【问题描述】:

给定一个字符串 s 和一个数字 n,编写一个函数,将偶数索引字符连接到前面,奇数索引字符连接到后面,n 次。 例子:

  • s = “哇例子!”`
  • result = "WwEapeo xml!"

下面是我对这个问题的回答,现在我需要优化这个解决方案,使其在 O(n) 中运行。请大家帮忙。

public class main {

    public static void main(String[] args) {
        String wordToJumble = "Wow Example!";
        Long numberOfTimes = 1L;
        jumbledString( wordToJumble,numberOfTimes);
    }

    public static String jumbledString(String s,Long n){
        StringBuilder sbEven = new StringBuilder();
        StringBuilder sbOdd = new StringBuilder();
        StringBuilder s2= new StringBuilder(s);
        char[] word = s.toCharArray();
        if(n>0) {
            while (n > 0) {
                n--; 
                sbEven.setLength(0);
                sbOdd.setLength(0); 
                for (int i = 0; i < word.length; i++) {
                    if (i % 2 == 0) {
                        sbEven.append(word[i]);
                    } else {
                        sbOdd.append(word[i]);
                    }
                }
                s2 = sbEven.append(sbOdd);
                word = s2.toString().toCharArray();

            }
            System.out.println(s2);
        }else{
            System.out.println(s2);
        }
        return s2.toString();
    }
}

【问题讨论】:

    标签: java string big-o stringbuilder


    【解决方案1】:

    只需要一个字符一个字符地添加到结果sbEvensbOdd 中。之后,append() n 次生成字符串。您可以使用charAt(int) 方法而不是将字符串转换为char[]

    该解决方案在O(n) 中,但请注意,n 不是您的numberOfTimes。这是字符串长度。

    public static String jumbledString(String s, long n) {
        StringBuilder sbEven = new StringBuilder();
        StringBuilder sbOdd = new StringBuilder();
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (i % 2 == 0) {
                sbEven.append(s.charAt(i));
            } else {
                sbOdd.append(s.charAt(i));
            }
        }
        for (int i = 0; i < n; i++) {
            result.append(sbEven);
            result.append(sbOdd);
        }
        return result.toString();
    }
    

    或者没有第二个循环,你可以使用repeat() 方法来处理String(我假设nlong):

    return result.toString().repeat((int) n);
    

    【讨论】:

    • 谢谢大家 这个解决方案很棒,但是我们需要能够多次混淆同一个字符串而不是连接它,因为这是我实施 n 次时发生的情况。
    • 对不起,我不明白,您能否提供更多详细信息,您究竟需要什么?每次乱码后字符串可以改变吗?
    • 所以字符串必须混杂 n 次。因此,由于字符串是不可变的,我使用 Char Array 来实现这一点。我在顶部提供的原始代码实现了这一点,但现在我需要优化解决方案,使其在 O(n) 中运行
    【解决方案2】:
    public class main {
    
    
    public static void main(String[] args) {
        String wordToJumble = "Wow Example!";
        Long numberOfTimes = 9L;
        jumbledString(wordToJumble, numberOfTimes);
    }
    
    public static String jumbledString(String s, Long n) {
        StringBuilder sbEven = new StringBuilder();
        StringBuilder sbOdd = new StringBuilder();
        char[] word = s.toCharArray();
        if (n > 0) {
                for (int x = 0; x < n; x++) {
                    word = newJumble(word, sbEven, sbOdd);
                }
        }
        System.out.println(word);
        return word.toString();
    }
    
    private static char[] newJumble(char[] s, StringBuilder sbEven, StringBuilder sbOdd) {
        sbEven.setLength(0);
        sbOdd.setLength(0);
        StringBuilder result;
        for (int i = 0; i < s.length; i++) {
            if (i % 2 == 0) {
                sbEven.append(s[i]);
            } else {
                sbOdd.append(s[i]);
            }
        }
        result = sbEven.append(sbOdd);
        return result.toString().toCharArray();
    }
    

    }

    【讨论】:

    • 通过这种方法,我能够分离嵌套循环并创建另一个私有方法来调用第二个循环。一种方法设置字符串的结构,另一种方法控制字符串混乱的次数。我使用 Char 数组是因为它们是可变的并且比字符串更易于管理。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    相关资源
    最近更新 更多