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))