分别反转字符串的每一个新单词
输入:“m’I gnivol twl”
输出:“I’m loving lwt”
- 默认起始字符位置为start=0,start指向初始i
- 循环如果当前字符不为空格 i++,最后i指向第一个空格
- 定义一个p指针指向start,代表每个新单词的初始位置。
- 核心:计算每个单词的终末位置:start+i-1-p,因为在-p,若使p++,则从后向前依次append()
- 如果i指针指向空格,则i++,此时i必为下一个新单词的起始位置。
public static String method(String s) {
StringBuffer sb = new StringBuffer();
int n = s.length();
int i = 0;// 无论遍历到什么,i每遍历到都++
while (i < n) {
int start = i; // 空格的下一个字符索引(即每个单词的起始位)
while (i < n && s.charAt(i) != ' ') {
i++;
}
for (int p = start; p < i; p++) {
// 从第一个单词的起始到第二个单词的起始
sb.append(s.charAt(start + i - 1 - p));
}
while (i < n && s.charAt(i) == ' ') {
i++;
sb.append(' ');
}
}
return sb.toString();
}
二进制求和
public static String method(String s1, String s2) {
StringBuilder sb = new StringBuilder();
int add = 0; // 进位初始0
int s1Len = s1.length() - 1;
int s2Len = s2.length() - 1;
for (int i = s1Len, j = s2Len; i >= 0 || j >= 0; i--, j--) {
int sum = add; // 保留进位,勿遗失,初始sum为进位
// int up = s1.charAt(i) - '0';
// int down = s2.charAt(j) - '0';
// sum = sum + up + down; // 勿遗失sum
// if (i >= 0) {
// sum=sum+(s1.charAt(i)-'0');
// }
//
// if (j >= 0) {
// sum=sum+(s2.charAt(j)-'0');
// }
// 简便写法
sum = sum + (i >= 0 ? s1.charAt(i) - '0' : 0);
sum = sum + (j >= 0 ? s2.charAt(j) - '0' : 0);
sb.append(sum % 2); // 竖式相加的结果,对2取余,即为当前位的值
add = sum / 2; // 判断是否有进位
}
sb.append(add == 1 ? add : ""); // 从右向左竖式计算,若最终有进位,则追加进位
return sb.reverse().toString(); // 反转字符串
}