今天上午在力扣添加了一个学习计划(编程基础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内建) | 需手动检查 | 需手动检查 |
适用场景 | 通用场景(推荐) | 极端性能敏感场景 |
平衡性能与代码可读性 |
}