-
最后一个单词的长度(*)
image.png
思路:先用trim()去掉首尾的空格。然后从后往前找倒数第一个空格,如果没有找到,说明只有一个单词,直接返回s的长度即可;如果找到了,就返回s.length() - 1 - i即为最后一个单词的长度
class Solution {
public int lengthOfLastWord(String s) {
s = s.trim();
int i = s.length() - 1;
while (i >= 0 && s.charAt(i) != ' ')
i--;
if (i == -1) {
return s.length();
} else {
return s.length() - 1 - i;
}
}
}
-
加一
image.png
思路:从最低位开始遍历,我们使用一个变量jinwei表示上一个位置的进位,初始值为 1,每一位的结果位a[i]+b[j]+jinwei mod 10,下一位的进位为a[i]+b[j]+jinwei/10。结束后若digits[0]等于0,则重新开辟一个数组并置首位为1 。
class Solution {
public int[] plusOne(int[] digits) {
int temp;
int jinwei = 1;
for (int i = digits.length - 1; i >= 0; i--) {
temp = (digits[i] + jinwei) % 10;
jinwei = (digits[i] + jinwei) / 10;
digits[i] = temp;
}
if (digits[0] == 0) {
int a[] = new int[digits.length + 1];
a[0] = 1;
for (int i = 1; i < a.length; i++) {
a[i] = 0;
}
return a;
} else {
return digits;
}
}
}
-
二进制求和(*)
image.png
思路:从最低位开始遍历,我们使用一个变量jinwei表示上一个位置的进位,初始值为 0,每一位的结果位a[i]+b[j]+jinwei mod 2,下一位的进位为a[i]+b[j]+jinwei/2。将结果位不断加到字符串中,最后倒置即可。
我的解答:
class Solution {
public String addBinary(String a, String b) {
int temp;
int jinwei = 0;
String s = "";
String result = "";
int i = a.length() - 1, j = b.length() - 1;
while (i >= 0 && j >= 0) {
temp = ((a.charAt(i)-'0') + (b.charAt(j)-'0') + jinwei) % 2;//char-‘0’可变为数字
jinwei = ((a.charAt(i)-'0') + (b.charAt(j)-'0') + jinwei) / 2;
s += temp;
i--;
j--;
}
if (i == -1) {
while (j >= 0) {
temp = (b.charAt(j) - '0' + jinwei) % 2;
jinwei = (b.charAt(j) - '0' + jinwei) / 2;
s += temp;
j--;
}
if (jinwei != 0) {
s += 1;
jinwei = 0;
}
}
if (j == -1) {
while (i >= 0) {
temp = (a.charAt(i) - '0' + jinwei) % 2;
jinwei = (a.charAt(i) - '0' + jinwei) / 2;
s += temp;
i--;
}
if (jinwei != 0) {
s += 1;
}
}
for (int k = s.length() - 1; k >= 0; k--) {
result += s.charAt(k);
}
return result;
}
}
官方解答:
官方的解答使用一个变量i,初始为长度最大的二进制串。然后从后往前不断将两个二进制串的每一位相加求余求进位。这个方法的特点是将位数少的二进制串中少的那几位当作0来对待
class Solution {
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();
int n = Math.max(a.length(), b.length()), carry = 0;
for (int i = 0; i < n; ++i) {
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
ans.append((char) (carry % 2 + '0'));
carry /= 2;
}
if (carry > 0) {
ans.append('1');
}
ans.reverse();
return ans.toString();
}
}