1.二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1
和 0
。
思路:补齐两个字符串,然后从后往前遍历。注意的是字符相加,其实内部就是对应的ascii码相加,所以我们可以将a[i] - '0' + b[i]的操作,实现得到对应位字符的相加结果。最前面一位是需要特殊处理的,for循环的条件得写对。
class Solution {
public:
string addBinary(string a, string b) {
int a1 = a.size();
int b1 = b.size();
while(a1<b1)
{
a = '0' + a;
++a1;
}
while(a1>b1)
{
b = '0' + b;
++b1;
}
for(int i=a.size()-1;i>0;--i)
{
a[i] = a[i]-'0'+b[i];
if(a[i]>='2')
{
a[i] = (a[i]-'0') % 2 +'0';
a[i-1] = a[i-1] + 1;
}
}
a[0] = a[0] - '0' + b[0];
if(a[0]>='2')
{
a[0] = (a[0]-'0') % 2 +'0';
a = '1' + a;
}
return a;
}
};
参考链接:https://leetcode-cn.com/problems/add-binary/
2.x 的平方根
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
思路:二分查找法。一个数的平方根肯定是小x/2+1的。所以设定首数为0,尾数为x/2+1. 设定循环条件是首数>=尾数。 不断更新首尾数。
注意的是,定义变量要是long long防止溢出。
class Solution {
public:
int mySqrt(int x) {
if (x ==0 || x == 1)
return x;
long long start= 0;
long long end= x / 2 + 1;
while(start <= end)
{
long long mid = (end+start) / 2;
long long res = mid * mid;
if(res==x)
return mid;
else if(res < x)
start = mid + 1;
else
end = mid - 1;
}
return end;
}
};