难度简单404收藏分享切换为英文关注反馈
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1
和 0
。
示例 1:输入: a = "11", b = "1" 输出: "100"
示例 2:输入: a = "1010", b = "1011" 输出: "10101"
提示:
- 每个字符串仅由字符
'0'
或'1'
组成。 1 <= a.length, b.length <= 10^4
- 字符串如果不是
"0"
,就都不含前导零。
思路一:(暴力法)
将二进制转换成10进制,然后再将10进制转换成2进制
但是这个程序有个Bug,要是二进制长度特别大,int的范围会溢出。
class Solution {
public:
string addBinary(string a, string b)
{
if(a.empty()) return b;
if(b.empty()) return a;
string res;
int n = bi_to_int(a)+bi_to_int(b);
if(n==0) return "0";
while(n>0)
{
res.append(to_string(n%2));//将10进制转成2进制字符串
n = n>>1;
}
reverse(res.begin(),res.end());// 除2 取余 倒置
return res;
}
int bi_to_int(string a) //将2进制转换成10进制
{
int i=0;
int num =0;
for(i = a.length()-1;i>=0;i--)
{
if(a.at(i)!='0')
{
num += pow(2,a.length()-1-i);//这个下标的处理,需要小心
}
}
return num;
}
};
class Solution {
public:
string addBinary(string a, string b)
{
if(a.empty()) return b;
if(b.empty()) return a;
string res;
int lena = a.size();
int lenb = b.size();
while(lena < lenb)//将两个字符串变为相同长度
{
a="0"+a;
lena++;
}
while(lenb < lena)
{
b="0"+b;
lenb++;
}
int flag = 0;
for(int i= lena-1;i>=0;i--)
{
if(a[i]-'0'+b[i]-'0'+flag ==0)
{
res ="0"+res;
flag =0;
}else if(a[i]-'0'+b[i]-'0'+flag ==1)
{
res ="1"+res;
flag =0;
}else if(a[i]-'0'+b[i]-'0'+flag ==2)
{
res ="0"+res;
flag =1;
}else if(a[i]-'0'+b[i]-'0'+flag ==3)
{
res ="1"+res;
flag =1;
}
}
if(flag ==1)
{
res ="1"+res;
}
return res;
}
};
难度中等47
求出大于或等于 N
的最小回文素数。
回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。
例如,2,3,5,7,11 以及 13 是素数。
回顾一下,如果一个数从左往右读与从右往左读是一样的,那么这个数是回文数。
例如,12321 是回文数。
示例 1:
输入:6 输出:7
示例 2:
输入:8 输出:11
示例 3:
输入:13 输出:101
提示:
1 <= N <= 10^8
- 答案肯定存在,且小于
2 * 10^8
。
class Solution {
public:
int primePalindrome(int N)
{
if(N<=2) return 2;
int i=N;
while(1)
{
if(isprime(i) && isPalindrome(i))//这个数即是素数,又是回文数
return i;
i++;
}
return 0;
}
bool isPalindrome(int n)//看这个整数是否是回文数
{
if(n == reverse(n))
return true;
return false;
}
bool isprime(int n) //这个数是否是素数
{
for(int i=2;i<n;i++)
{
if(n%i == 0)
return false;
}
return true;
}
int reverse(int x) //翻转正整数,并返回
{
int result = 0;
while(x != 0)
{
if(result>INT_MAX / 10) return 0; //判断是否将要发生越界
if(result<INT_MIN / 10) return 0;
result = result*10 + x%10;
x= x/10;
}
return result;
}
};
但是这种解法有个问题,当数字特别大的时候容易超时,LeetCode上通不过。后续待改进。。。。