Cool说丨力扣67与859

简介: 67. 二进制求和859. 亲密字符串

67. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 10

示例 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. 亲密字符串

给定两个由小写字母构成的字符串 AB ,只要我们可以通过交换 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


提示:

  1. 0 <= A.length <= 20000
  2. 0 <= B.length <= 20000
  3. AB 仅由小写字母构成。

第一版,错误的解法

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]];

   }


目录
相关文章
|
人工智能 C# C++
Cool说丨力扣153、454
153. 寻找旋转排序数组中的最小值 454. 四数相加 II
130 1
|
C# C++
Cool说丨力扣287/792/378
关注博主,获取更多知识
105 0
|
C# C++ 索引
Cool说丨力扣162
162. 寻找峰值
96 0
|
存储 C# C++
Cool说丨力扣29/34
关注博主。获取更多知识
105 0
|
存储 C# C++
Cool说丨力扣392
392. 判断子序列
75 0
|
C# C++
Cool说丨力扣744、704
744. 寻找比目标字母大的最小字母 704. 二分查找
106 0
|
C#
Cool说丨力扣475
475. 供暖器
114 0
|
机器学习/深度学习 算法 C#
Cool说丨力扣202
202. 快乐数
100 0
|
C#
Cool说丨力扣167
167. 两数之和 II - 输入有序数组
71 0
|
C# C++
Cool说丨力扣374、441
441. 排列硬币 374. 猜数字大小
90 0