①最后一个单词的长度
给定一个仅包含大小写字母和空格 ' '
的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 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;
}
};