67. 二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
第一版,其实不难,仔细一点就可以了
执行用时 :8 ms, 在所有 cpp 提交中击败了48.84%的用户
内存消耗 :8.7 MB, 在所有 cpp 提交中击败了45.19%的用户
stringaddBinary(stringa, stringb) {
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
if (a.size() <b.size()) swap(a, b);
vector<char>res;
intlen=b.size(),minus=a.size()-b.size();
for (inti=0; i<len; ++i) {
res.push_back(b[i] -'0'+a[i]);
}
//cout << res << endl;
for (inti=len; i<len+minus; ++i)
res.push_back(a[i]);
/*reverse(res.begin(), res.end());
cout << res << endl;*/
//for (auto a : res)
// cout << a;
//cout << endl;
for (inti=0; i<len+minus-1; ++i) {
if (res[i] >='2') {
res[i+1] =res[i+1] + (res[i] -'0')/2;
res[i] ='0'+ (res[i] -'0') %2;
}
//for (auto a : res)
// cout << a;
//cout << endl;
}
//cout << res << endl;
stringresult;
for (auto&a : res)
result+=a;
//cout << result << endl;
reverse(result.begin(), result.end());
if (result[0] >'1') {
result[0] =result[0] -2;
result='1'+result;
}
//cout << res << endl;
//while (res[0] > '1') {
// res[0] = res[0] - 2;
// res = '1' + res;
//}
//reverse(res.begin(), res.end());
returnresult;
}
859. 亲密字符串
给定两个由小写字母构成的字符串 A
和 B
,只要我们可以通过交换 A
中的两个字母得到与 B
相等的结果,就返回 true
;否则返回 false
。
示例 1:
输入: A = "ab", B = "ba"
输出: true
示例 2:
输入: A = "ab", B = "ab"
输出: false
示例 3:
输入: A = "aa", B = "aa"
输出: true
示例 4:
输入: A = "aaaaaaabc", B = "aaaaaaacb"
输出: true
示例 5:
输入: A = "", B = "aa"
输出: false
提示:
0 <= A.length <= 20000
0 <= B.length <= 20000
A
和B
仅由小写字母构成。
第一版,错误的解法
boolbuddyStrings(stringA, stringB) {
if (A.size() !=B.size()) returnfalse;
intlen=A.size(), index=0;
unordered_set<char>res;
stringstrA, strB;
for (inti=0; i<len; ++i) {
if (A[i] !=B[i]) {
strA+=A[i];
strB+=B[i];
}
else
res.insert(A[i]);
}
if (res.size() ==1) returntrue;
if (strA.size() !=2) returnfalse;
returnstrA[0] ==strB[1] &&strA[1] ==strB[0];
}
第二版,看了提示
执行用时 :8 ms, 在所有 cpp 提交中击败了68.31%的用户
内存消耗 :9.2 MB, 在所有 cpp 提交中击败了19.33%的用户
就三种情况
1、长度不一样或者长度小于2,直接false
2、不匹配的个数超过2个,false
3、如果全部一样,则看A中是否有重复的字符,有就是true了,
否则就看两个不匹配的位序上的字符交换后是否一样
boolbuddyStrings(stringA, stringB) {
if (A.size() !=B.size() ||A.size()<2) returnfalse;
intlen=A.size();
vector<int>res;
res.reserve(len);
for (inti=0; i<len; ++i) {
if (A[i] !=B[i]) {
res.push_back(i);
if (res.size() >2) returnfalse;
}
}
if (res.size() ==0) {
unordered_set<char>misMatch(A.begin(), A.end());
returnmisMatch.size() <len;
}
returnA[res[0]] ==B[res[1]] &&A[res[1]] ==B[res[0]];
}