给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 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/
实现 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; } };参考链接:https://leetcode-cn.com/problems/sqrtx/