3.3 做题string & 优秀的进位代码

String:
String 是不可变的(immutable),每次对 String 的修改都会生成一个新的 String 对象。
适用于不需要频繁修改字符串的场景。
StringBuilder:
StringBuilder 是可变的(mutable),可以在原有对象上进行修改。
非线程安全,适用于单线程环境下的字符串操作。
性能较高,因为不需要每次生成新的对象。
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();

    // 追加字符串
    sb.append("Hello");
    sb.append(" ");
    sb.append("World");
    System.out.println(sb.toString()); // 输出: Hello World

    // 插入字符串
    sb.insert(5, "Beautiful ");
    System.out.println(sb.toString()); // 输出: Hello Beautiful World

    // 删除字符串
    sb.delete(6, 14);
    System.out.println(sb.toString()); // 输出: Hello World

    // 反转字符串
    sb.reverse();
    System.out.println(sb.toString()); // 输出: dlroW olleH

    // 设置指定位置的字符
    sb.setCharAt(0, 'W');
    System.out.println(sb.toString()); // 输出: WdlroW olleH

    // 获取子字符串
    String sub = sb.substring(1, 4);
    System.out.println(sub); // 输出: dlr

    // 转换为 String
    String str = sb.toString();
    System.out.println(str); // 输出: WdlroW olleH
}

}
StringBuffer:
StringBuffer 也是可变的(mutable),可以在原有对象上进行修改。
线程安全,适用于多线程环境下的字符串操作。
性能较低,因为需要进行线程同步。

class BinarySum {
public String addBinary(String a, String b) {
StringBuilder result = new StringBuilder();
int i = a.length() - 1; // 指向字符串a的末尾
int j = b.length() - 1; // 指向字符串b的末尾
int carry = 0; // 进位

    // 遍历所有可能的位和进位
    while (i >= 0 || j >= 0 || carry > 0) {
        // 获取当前位的值,若超出字符串范围则视为0
        int numA = (i >= 0) ? a.charAt(i--) - '0' : 0;
        int numB = (j >= 0) ? b.charAt(j--) - '0' : 0;

        // 计算当前位的和(包括进位)
        int sum = numA + numB + carry;
        result.append(sum % 2);  // 当前位的二进制结果
        carry = sum / 2;         // 更新进位
    }

    // 反转结果字符串,得到正确顺序
    return result.reverse().toString();
}

}

字符串匹配startswith
if (s.startsWith(symbols[j], i))

posted @ 2025-03-03 20:10  Toby0919  阅读(11)  评论(0)    收藏  举报