当前位置:   article > 正文

【LeeCode算法】第67题:二进制求和

【LeeCode算法】第67题:二进制求和

目录

一、题目描述

二、初次解答

三、官方解法

四、总结


一、题目描述

二、初次解答

1. 思路:将a和b两个字符串转换成十进制,然后将相加的结果转换回文本的二进制。

2. 代码:

  1. char* addBinary(char* a, char* b) {
  2. int a_len = strlen(a);
  3. int b_len = strlen(b);
  4. //将a和b的二进制转换为int十进制
  5. int value[2] = {0, 1};
  6. int aRet = 0, bRet = 0;
  7. for (int i = a_len - 1; i >= 0; --i) {
  8. aRet += value[a[i] - '0'] * pow(2, a_len - 1 - i);
  9. }
  10. for (int j = b_len - 1; j >= 0; --j) {
  11. bRet += value[b[j] - '0'] * pow(2, b_len - 1 - j);
  12. }
  13. //计算十进制之和,将结果转换为二进制并保存
  14. int Ret = aRet + bRet;
  15. if (Ret == 0) {
  16. return a;
  17. }
  18. int lenMax = (a_len > b_len)?a_len:b_len;
  19. char* ret = (char*)malloc(sizeof(char) * (lenMax + 2));
  20. ret[lenMax + 1] = '\0';
  21. char valuec[2] = {'0', '1'};
  22. int k = lenMax;
  23. for (; Ret != 0; --k) {
  24. ret[k] = valuec[Ret % 2];
  25. Ret /= 2;
  26. }
  27. if (k >= 0){
  28. return ret + 1;
  29. }
  30. return ret;
  31. }

3. 缺陷:对于相加超过int范围的例子,就无法求解!

三、官方解法

1. 思路:将两个字符串反转,然后存放至目标数组的元素值为(a[i]+b[i]+进位值)%2,而进位值为(a[i]+b[i]+进位值)/2。最后,将目标数组再次反转即可。

2. 代码:

  1. void reverse(char* s) {
  2. int len = strlen(s);
  3. for (int i = 0, j = len - 1; i < j; i++, j--){
  4. char temp = s[i];
  5. s[i] = s[j];
  6. s[j] = temp;
  7. }
  8. }
  9. char* addBinary(char* a, char* b) {
  10. reverse(a);
  11. reverse(b);
  12. int a_len = strlen(a), b_len = strlen(b);
  13. int lenMax = (a_len > b_len)?a_len:b_len;
  14. char* ret = (char*)malloc(sizeof(char) * (lenMax + 2));
  15. int flag = 0, len = 0;
  16. for (int i = 0; i < lenMax; ++i){
  17. flag += i < a_len ? (a[i] == '1') : 0;
  18. flag += i < b_len ? (b[i] == '1') : 0;
  19. ret[len++] = flag % 2 + '0';
  20. flag /= 2;
  21. }
  22. if (flag == 1){
  23. ret[len++] = '1';
  24. }
  25. ret[len] = '\0';
  26. reverse(ret);
  27. return ret;
  28. return a;
  29. }

3. 优点:实现思想较为简单。

4. 缺点:①使用了三次反转,执行时间较长。②核心for循环中的语句很难想到这么精简的。

四、总结

当遇到反向操作时,可以尝试使用三次反转来完成。另外,对于位数不齐的情况,可以使用三元运算符来综合有位数和无位数的情况。例如,flag += i < a_len ? (a[i] == '1) : 0;就是先判定i是不是小于a的长度,如果是才进行访问,否则直接给0,避免了越界访问的错误。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/640440
推荐阅读
相关标签
  

闽ICP备14008679号