LC(day1)要求合并两个字符串,规则是从 word1 开始,交替添加字母,如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

本文介绍了如何使用Java的StringBuilder类合并两个字符串,按交替顺序添加字符,同时处理长度不等的情况。作者提供了初始代码实现、错误分析和修正后的代码优化。
摘要由CSDN通过智能技术生成
  1. 问题概述

    • 需要合并两个字符串。
    • word1 开始,交替添加字母。
    • 如果一个字符串比另一个字符串长,将多出来的字母追加到合并后字符串的末尾。
  2. 示例分析

    • 示例 1:word1 = "abc", word2 = "pqr"。合并过程如上述解释。
    • 示例 2:word1 = "ab", word2 = "pqrs"。合并过程如上述解释。
    • 示例 3:word1 = "abcd", word2 = "pq"。合并过程如上述解释。
  3. 解决思路

    • 使用两个指针 ij 分别指向两个字符串的起始位置。
    • 通过循环,交替添加 word1[i]word2[j] 到合并后的字符串,同时移动指针。
    • 处理两个字符串长度不同的情况,将多出来的字符追加到合并后字符串的末尾。
  4. 代码实现

    • 使用 StringBuilder 作为结果字符串的容器。
    • 循环条件是 ij 同时不超出对应字符串的长度。
    • 在循环中,依次添加 word1[i]word2[j] 到结果字符串,并移动指针。
    • 处理长度不同的情况,将多出来的字符追加到结果字符串的末尾。
  5. 我的代码:
    class Solution {
        public String mergeAlternately(String word1, String word2) {
            int i = 0;
            int j = 0;
            int m = word1.length();
            int n = word2.length();
            StringBuilder ans = new StringBuilder();
            while ((i < m) && (j < n)) {
                ans.append(word1.charAt(i));
                ans.append(word2.charAt(j));
                i++;
                j++;
            }
            if (j == n && i != m-1) {
                while (i < m) {
                    ans.append(word1.charAt(i));
                    i++;
                }
            }
            if (i == m && j != n-1) {
                while (j < n) {
                    ans.append(word2.charAt(j));
                    j++;
                }
            }
            return ans.toString();
        }
    }
    

    但是始终报错,问题出在第二三个while循环上,排查问题,最终发现问题出在if的判断条件上,

  6.  if (i == m && j != n-1 ) {

                while (j < n) {

                    ans.append(word2.charAt(j));

                    j++;

                }

            }

  7. Word1=ab ,word2=pqrs
    初始状态:i = 0, j = 0, m = 2, n = 4, ans = ""
    第一次循环:
    ans.append(word1.charAt(i)),ans = "a"
    ans.append(word2.charAt(j)),ans = "ap"
    i++,j++,此时 i = 1, j =1 
    ans.append(word1.charAt(i)),ans = "apb"
    ans.append(word2.charAt(j)),ans = "apbq"
    i++,j++,此时 i = 1, j =1 
    第二次循环:
    ans.append(word1.charAt(i)),ans = "ab"
    ans.append(word2.charAt(j)),ans = "abq"
    i++,j++,此时 i = 2, j = 2
    
    跳出主循环
    进入第一个剩余字符处理的 if,不符合条件,:        
    
    
    由于 i == m == 2,我们进入第3个if语句,
    此时j不等于3,ans.append(word2.charAt(j)),ans = "apbqr"
    j++,j=4,不符合循环判断条件,无法继续进行,跳出循环,输出结果

    改正如下:

    class Solution {
        public String mergeAlternately(String word1, String word2) {
            int i = 0;
            int j = 0;
            int m = word1.length();
            int n = word2.length();
            StringBuilder ans = new StringBuilder();
            while ((i < m) && (j < n)) {
                ans.append(word1.charAt(i));
                ans.append(word2.charAt(j));
                i++;
                j++;
            }
            if (j == n && i != m) {
                while (i < m) {
                    ans.append(word1.charAt(i));
                    i++;
                }
            }
            if (i == m && j != n) {
                while (j < n) {
                    ans.append(word2.charAt(j));
                    j++;
                }
            }
            return ans.toString();
        }
    }

    优化如下:

  8. class Solution {
        public String mergeAlternately(String word1, String word2) {
            int i = 0;
            int j = 0;
            int m = word1.length();
            int n = word2.length();
            StringBuilder ans = new StringBuilder();
            while ((i < m) && (j < n)) {
                ans.append(word1.charAt(i));
                ans.append(word2.charAt(j));
                i++;
                j++;
            
                while (i < m) {
                    ans.append(word1.charAt(i));
                    i++;
                }
       
                while (j < n) {
                    ans.append(word2.charAt(j));
                    j++;
                }
        
            return ans.toString();
        }
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值