一. 最后一个单词的长度
分析:字符串可能是 “Hello World”,“ Hello World”,“Hello World ”,“ Hello World ”
,首尾不一定有空格,所以在处理字符串的时候,先把首尾字符串去掉,使用trim()
函数,然后将字符串根据空格分割成字符串数组,使用split()
函数
代码
class Solution {
public int lengthOfLastWord(String s) {
if(s.length() == 0)
return 0;
else
{
String[] a = s.trim().split(" ");
return a[a.length-1].length();
}
}
}
二. 加一
分析:这道题目看了两三遍没看懂,看了评论区的解析才看懂,意思就是将一串数字按个分别放进数组,然后 +1,那就得考虑特殊情况,假如碰到数字9的情况下,就得设置为0,然后往前 +1;只要没碰到9,那就原地 +1,假如碰到的都是9,那就重新设置数组长度 +1,然后数组第一个元素数值为1
代码
class Solution {
public int[] plusOne(int[] digits) {
//数组中只要有一个不是9就直接+1,然后返回数组
for(int i = digits.length - 1; i >= 0; i--)
{
if(digits[i] != 9)
{
digits[i] = digits[i] + 1;
return digits;
}
digits[i] = 0;
}
//跳出循环,说明数组中都是9,那么创建新数组,长度+1
int[] temp = new int[digits.length + 1];
temp[0] = 1;
return temp;
}
}
三. 二进制求和
3.1 Java中的移位运算符
左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
右移一位相当于除以2的1次方,右移n位就相当于除以2的n次方。
10 << 1 = 20
10 << 3 = 80
6 >> 1 = 3
6 >> 2 = 1
3.2 StringBuilder类
String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。在需要对字符串执行重复修改的情况下,与创建新的 String 对象相关的系统开销可能会非常昂贵。如果要修改字符串而不创建新的对象,则可以使用 System.Text.StringBuilder
类。例如,当在一个循环中将许多字符串连接在一起时,StringBuilder
类可以提升性能。通过用一个重载的构造函数方法初始化变量,可以创建 StringBuilder
类的新实例
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
3.3 题目
3.4 解析
根据二进制的相加规则,当前位相加再%2则为结果,进位则/2
。可以先建立一个StringBuilder类型的result,从后往前,将每一位相加,结果加入result,最后反转输出
。
3.5 代码
class Solution {
public String addBinary(String a, String b) {
StringBuilder result = new StringBuilder();
//二进制相加从后往前
int al = a.length()-1;
int bl = b.length()-1;
// 存储进位
int carry = 0;
while( al >=0 || bl >=0 )
{
int sum = carry;
if(al >= 0)
{
sum += (a.charAt(al) - '0');
al--;
}
if(bl >= 0)
{
sum += (b.charAt(bl) - '0');
bl--;
}
result.append(sum%2); //相加结果
carry = sum /2; //进位,如果是1那么carry=0,如果是2则要进位给下面一位+1
}
if(carry !=0 ) //都相加完了,还要进位的情况
result.append(1);
return result.reverse().toString(); //先反转,再输出
}
}