Plus One
原题链接Plus One
用数组表示一个整数,返回这个整数加一后的数组
其实只要从后面开始找,直到找到第一个不为9的位置,将其值加一然后就可以返回了,之前的9都变为0。
因为后面都是9,加一都变成0,然后向高位进位,使高位加一,只要当高位不是9时才会停止继续向高位进位,所以从后面开始找到第一个不为9的位置即可。
如果所有数字都是9,就说明需要增加一个高位1,比如999变为1000,但是数组只有3位,一种方法是在开头插入一个数字1,但是这就需要移动后面的元素了。仔细观察发现后面的元素都是0,那么可以将第一个0变为1,然后在数组后面追加一个0即可,不需要移动元素。
代码如下
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
if(digits.empty())
return digits;
for(int i = digits.size() - 1; i >= 0; --i)
{
/* 如果一直是9,就一直变0 */
if(digits[i] == 9)
{
digits[i] = 0;
}
/* 直到找到第一个不是9的,此时不再向高位进位,加一返回 */
else
{
++digits[i];
return digits;
}
}
/* 如果一直是9,那么digits将全变为0,此时需要在高位添加一个1 */
digits[0] = 1;
digits.push_back(0);
return digits;
}
};
Add Strings
原题链接Add Strings
直接从后往前加即可
代码如下
class Solution {
public:
string addStrings(string num1, string num2) {
string res("");
int idx1 = num1.size() - 1;
int idx2 = num2.size() - 1;
int n = 0;
while(idx1 >= 0 || idx2 >= 0 || n > 0)
{
n += (idx1 >= 0) ? (num1[idx1--] - '0') : 0;
n += (idx2 >= 0) ? (num2[idx2--] - '0') : 0;
res = static_cast<char>(n % 10 + '0') + res;
n /= 10;
}
return res;
}
};
Add Binary
原题链接Add Binary
将两个用字符串表示的二进制数相加。
从低位开始相加,并考虑进位,如果到达最高位时仍然有进位,需要增加一位。
代码如下
class Solution {
public:
string addBinary(string a, string b) {
string res("");
int a_idx = a.size() - 1;
int b_idx = b.size() - 1;
/* n可以既表示当前值,也可以表示进位,省去了单独用一个变量记录进位的麻烦 */
int n = 0;
/* 进位也可以放在while循环的条件中,省去了循环外面单独判断是否仍有进位的麻烦 */
while(a_idx >= 0 || b_idx >= 0 || n > 0)
{
n += (a_idx >= 0) ? a[a_idx--] - '0' : 0;
n += (b_idx >= 0) ? b[b_idx--] - '0' : 0;
res = static_cast<char>(n % 2 + '0') + res;
n /= 2;
}
return res;
}
};
上述两道题都是整数加法,不过都是用数组或者字符串表示的整数,需要一位一位求解。数组加一的题中找到第一个不为0的位置的技巧可以减少循环次数。二进制相加的题中将当前位相加的值和进位用一个变量表示,同时判断是否有进位也放在循环中,省去了不少麻烦。