Java基础学完,继续深耕01.1(0423)力扣1768.交替合并字符串

今天上午在力扣添加了一个学习计划(编程基础0到1)

就是这个。

在这个里面写了一道题“交替合并字符串”

说句实话,第一次写这种题。确实是没思路。

看了他的提示(双指针,然后字符串拼接),这才小有思路。

我大概用了40min(大佬别喷我,真是纯小白)写了三种方法(其实都差不多哈哈哈哈)

public static String method1(String word1, String word2){
        int m = word1.length();//获取第一个字符串的长度
        int n = word2.length();//获取第二个字符串的长度
        // 初始化两个指针i和j,分别用于遍历word1和word2 
        int i = 0;
        int j = 0;
        //创建一个StringBuilder对象用于构建结果字符串 (方便拼接操作)
        StringBuilder sb = new StringBuilder();
        // 循环条件:只要i或j中至少有一个小于对应单词的长度就继续循环 
        while (i < m||j < n){
            if (i < m){
                sb.append(word1.charAt(i));
                i++;
            }
            if (j < n){
                sb.append(word2.charAt(j));
                j++;
            }
        }
        // 将StringBuilder转换为String并返回 
        return sb.toString();
    }

这就是方法一(StringBuilder + charAt)

思路就是:你想要实现字符交替出现,肯定先要获取字符串中的各个元素。此时可以想到 charAt() 是 Java 中 String 类的一个方法,它的作用是返回字符串中指定索引位置的字符。

之后,应想到应该遍历字符串。怎么遍历呢?--循环遍历;遍历的条件是什么呢?--只要i或j中至少有一个小于对应单词的长度就继续循环 。

遍历之后,肯定要实现拼接,拼接后返回的对象是要呈现出来的结果。本质就是字符串的拼接操作。我们可以想到StringBuilder对象(一定注意他是对象!!!,最后要调用toString方法将对象转换为字符串)。拼接用的是append()方法(方便之处)。

ps:答案是++i,++j,但是我写的也对。不知为什么,是能提高效率吗??

public static String method2(String word1,String word2){
        char[] arr1 = word1.toCharArray();
        char[] arr2 = word2.toCharArray();
        int m = arr1.length;
        int n = arr2.length;
        char[] result = new char[m + n];
        int index = 0;
        int i = 0;
        while (i < Math.max(m,n)){
            if (i < m){
                result[index] = arr1[i];
                index++;
            }
            if (i < n){
                result[index] = arr2[i];
                index++;
            }
            i++;
        }
        return new String(result);
    }

这个是方法二(char[] + 拼接)

字符串写完后,我又想到,如果将字符串转换为字符数组会怎么样。所以就有了方法二

这个方法的第一版

while (i < Math.max(m,n)){
result[index] = arr1[i];
index++;
result[index] = arr2[i];
index++;
i++;

我是这样写while的。后来在idea上运行正确但是在力扣上面测试不通过。我用ai搜了一下。原因是(你提供的代码在某些情况下会抛出 ArrayIndexOutOfBoundsException,主要原因是没有正确处理 word1 和 word2 长度不相等的情况。当 i 超过较短数组的长度时,仍然会尝试访问 arr1[i] 或 arr2[i],导致越界错误。)md,ai真好用。

后来我就增加了两个if判断。思路跟法一差不多。时间复杂度上法一法二都是O(M+N)

但是我不知道这两方法的优缺点,我再一次咨询了ai(哈哈哈哈哈)

{

性能- JVM 对 StringBuilder 和 charAt() 有深度优化。
- 无需额外数组拷贝。
- 数组直接访问更快(O(1) 随机访问)。
- 但需额外转换 toCharArray()
内存仅需 StringBuilder 的内存,无冗余。需额外存储 arr1 和 arr2 的副本,内存占用更高。
边界安全通过 i < m 和 j < n 自动检查,无需手动处理。需显式检查 i < m 和 i < n,否则可能越界。
可读性逻辑直观,符合“交替拼接”的语义。需手动管理数组索引,代码稍复杂。

}ai是这样说的。

此时机智的我想到了结合一下吧。于是有了方法三哈哈哈哈哈

    public static String method3(String word1,String word2){
        char[] arr1 = word1.toCharArray();
        char[] arr2 = word2.toCharArray();
        int m = arr1.length;
        int n = arr2.length;
        int i = 0;
        StringBuilder sb = new StringBuilder();
        while (i < Math.max(m,n)){
            if (i < m){
                sb.append(arr1[i]);
            }
            if (i < n){
                sb.append(arr2[i]);
            }
            i++;
        }
        return new String(sb);
    }

这就是方法三char[] + StringBuilder

这个纯纯缝合怪,但是惊奇的发现他在力扣上的时间复杂度居然是!!!

这是不是提升呢?哈哈哈哈

接下来的对比还是ai说的嘻嘻

                                一                                       二                                          三

性能高(JVM优化)最高(直接内存操作)高(接近纯数组,但省去手动填充)
内存占用最低(无额外数组)高(需存两份数组+结果数组)中(需存两份数组)
代码简洁性最简洁较复杂(需管理索引)简洁(结合StringBuilder)
边界安全性自动检查(charAt内建)需手动检查需手动检查
适用场景通用场景(推荐)极端性能敏感场景

平衡性能与代码可读性

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值