初识Leetcode----学习(七)【最后一个单词的长度、加一、二进制求和】

最后一个单词的长度

给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指由字母组成,但不包含任何空格的字符串。

示例:

输入: "Hello World"
输出: 5

1.从后往前遍历,找到第一个不为空格的字符,然后给定一个计数值count计数,直到该字符为空格,返回count:

class Solution {
public:
    int lengthOfLastWord(string s) {
        int count = 0;
        int i = s.size() - 1;
        while (i >=0 && s[i] == ' ' )   //如果字符为空,则往下遍历,直到第一个不为空的字符
            --i;
        while (i >= 0 && s[i] != ' ')   //对不为空的字符进行计数,直到字符位空
        {
            ++count;
            --i;
        }
        return count;
    }
};

加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

1.从数组最后一个元素开始判断,如果不为9则将该值加1,否则将该元素值置为0,对所有元素判断完之后,再判断首元素值是否为0,如果为0则在数组的第一个位置加上1,返回该数组:

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        for (int i = digits.size() - 1; i >= 0; --i)
        {
            if (digits[i] == 9)  //如果元素值为9,则将加1之后的0赋給该元素值
                digits[i] = 0;
            else
            {
                digits[i] += 1;  //如果元素值不为9,则执行加1操作
                return digits;
            }
        }
        if (digits.front() == 0)       //如果首元素为0,说明该位有进位,则添加一个1到最高位
            digits.insert(digits.begin(), 1);
        return digits;
    }
};

类似于“加1”题,“67、二进制求和”也用到类似的思想

二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

1.类似于我们平时求解二进制求和的题目,设置一个进位标识量(初始化为0),对于每一位相加的结果存入新string  result中,然后将除2的结果设为进位标识量carry,在对所有位相加之后,判断carry位,如为1则在所得结果首位加上1:

class Solution {
public:
    string addBinary(string a, string b) {
        if (a.size() < b.size())   //将字符串b设定为较短长度字符串
        {
            string temp = a;
            a = b;
            b = temp;
        }
         int alength = a.size() - 1;  //字符串a的长度
        int blength = b.size() - 1;   //字符串b的长度
        int carry = 0;                //进位标识量
        string result = "";           //初始化保存最终所得结果的string为空
        while (blength >= 0)         //处理较短字符串,能进行相加的位
        {
            int sum = (a[alength] - '0') + (b[blength] - '0') + carry;  //得到二进制相加的“结果”
            result = to_string(sum % 2) + result;  //to_string将求和之后的结果转换为字符并加到结果中
            carry = sum/2;     //得到新的进位
            alength--;
            blength--;
        }
        while (alength >= 0)     //处理较长字符串,不能进行相加的位,并将结果加到最终结果中
        {
            int sum = (a[alength] - '0') + carry;
            result = to_string(sum % 2) + result;
            carry = sum/2;
            alength --;
        }
        if (carry == 1)         //进位为1,将1加到最终结果首位
            result = "1" + result;
        return result;
    }
};

2.思路与上述一致,简化代码,将上述代码长度判断和对于长短字符串的处理放进一个for循环中:

class Solution {
public:
    string addBinary(string a, string b) {
        string result = "";
        int i,j,carry = 0;
        for (i = a.size() - 1, j = b.size() - 1;i >= 0 || j >= 0; --i,--j)
        {
            int ai = i >= 0 ? a[i] - '0' : 0;
            int bj = j >= 0 ? b[j] - '0' : 0;
            int temp = (ai + bj + carry) % 2;
            carry = (ai + bj + carry)/2;
            result = to_string(temp) + result;
        }
        if (carry == 1)
            result = "1" + result;
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/83033522
今日推荐