二进制求和
问题描述
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
解题思路
第一个想到的是计算机底层中加法运算的实现方法,其实也就是手算过程,引入一个进制位参与运算:
class Solution {
public:
string res(string a,string b){
char jinwei='0';
int n=a.size();
int m=b.size();
string res="";
for(int i=n-1;i>=0;i--){
int temp=i-(n-m);
if(temp>=0){
if(a[i]=='0'&&b[temp]=='0'&&jinwei=='0')
res='0'+res;
else if(a[i]=='1'&&b[temp]=='1'&&jinwei=='1')
res='1'+res;
else if(a[i]=='1'&&b[temp]=='1'&&jinwei=='0'){
res='0'+res;
jinwei='1';
}else if(a[i]=='1'&&b[temp]=='0'&&jinwei=='1')
res='0'+res;
else if(a[i]=='0'&&b[temp]=='1'&&jinwei=='1')
res='0'+res;
else if(a[i]=='0'&&b[temp]=='0'&&jinwei=='1'){
res='1'+res;
jinwei='0';
}else if(a[i]=='0'&&b[temp]=='1'&&jinwei=='0')
res='1'+res;
else if(a[i]=='1'&&b[temp]=='0'&&jinwei=='0')
res='1'+res;
}else{
if(a[i]=='1'&&jinwei=='1'){
res='0'+res;
jinwei='1';
}else if(a[i]=='1'&&jinwei=='0')
res='1'+res;
else if(a[i]=='0'&&jinwei=='1'){
res='1'+res;
jinwei='0';
}else
res='0'+res;
}
}
if(jinwei=='1')
res='1'+res;
return res;
}
string addBinary(string a, string b) {
int n=a.size();
int m=b.size();
if(n>m) return res(a,b);
else return res(b,a);
}
};
验证回文串
问题描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
说明:回文串是一种特殊的字符串,它从左往右读和从右往左读是一样的。
解题思路
先把单纯的字母和数字提取出来存到新字符串中,然后比较新字符串的头和尾,若出现不匹配则返回false。
class Solution {
public:
bool isPalindrome(string s) {
string ss="";
int n=s.size();
for(int i=0;i<n;i++){//提取出字母和数字
if((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z'))
ss=s[i]+ss;
if(s[i]>='A'&&s[i]<='Z'){
char temp=s[i]+('a'-'A');
ss=temp+ss;
}
}
int m=ss.size();
int k=m/2;
for(int i=0;i<k;i++){
if(ss[i]!=ss[m-i-1])//比较头尾
return false;
}
return true;
}
};
时间复杂度是O(n),但是给的数据太大,还是超时了。
因此只能直接在原字符串上进行判断。想到可以用两个指针,low指向字符串的头,high指向字符串的尾,若指向的字符不是字母或数字则low++,high–;若头尾指针都指向了字母或数字,则进行比较,不同则返回false,相同则继续low++,high–,直到low>high为止。
class Solution {
public:
bool isPalindrome(string s) {
int n=s.size();
int low=0;
int high=n-1;
while(low<high){
if(!isalpha(s[low])&&!isdigit(s[low]))//非字母或数字
low++;
cout<<"low="<<low<<endl;
if(!isalpha(s[high])&&!isdigit(s[high]))//非字母或数字
high--;
cout<<"high="<<high<<endl;
if((isalpha(s[low])||isdigit(s[low]))&&(isalpha(s[high])||isdigit(s[high]))){
if(isdigit(s[low])){
if(s[low]!=s[high]) return false;
cout<<"22"<<endl;
}else{cout<<"33";
if((s[low]==s[high])||(s[low]==s[high]+32)||(s[low]==s[high]-32));
else return false;
}
high--;
low++;
}
}
return true;
}
};
时间复杂度变成了O(n/2),而且也不用额外的空间去存一个新的字符串。
看了题解之后发现题解的思路也差不多就是双指针,新的收获就是可以用库函数isalnum(char a)直接判断是否为数字或字母。