算法 — easy —最后一个单词的长度,加一,二进制相加

一. 最后一个单词的长度

在这里插入图片描述
分析:字符串可能是 “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中的移位运算符

左移一位相当于乘以21次方,左移n位就相当于乘以2的n次方。
右移一位相当于除以21次方,右移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();  //先反转,再输出
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值