zoukankan      html  css  js  c++  java
  • LeetCode手记-Add Binary

    问题描述

     

     

    问题分析

    分析题意,此题实际是求解两个二进制数的和,但是有两点要注意:

    1.字符串的长度不限,所以相应十进制数值很可能会超过int的上限。

    2.二进制的加法规则是自右向左进位,需要注意,以题目示例为例:

          11

         +  1

         ------

          100

    所以直接将二进制字符串转成十进制值相加求和,再将十进制和转为二进制字符串的做法是不被接受的,虽然其复杂度只有O(1),错误做法如下;

    public class Solution {
        public string AddBinary(string a, string b) {
            var result = string.Empty;
                var sum = StringToInt(a) + StringToInt(b);
                result = IntToString(sum);
                return result;
        }
        public long StringToInt(string s)
            {
                
                if (s != null || s.Length > 0)
                {
                    var a = Convert.ToInt32(s, 2);
                    return a;
                }
                return long.Parse("0");
    
            }
    
            public string IntToString(long i)
            {
                var b = string.Empty;
                b= Convert.ToString(i, 2);
                return b;
            }
    }

    正确的做法应该是将二进制字符串转为字符集合,根据进算结果相应进位或者求和,这样可以忽略int上限,复杂度也仅为O(n),代码实现如下:

    public class Solution {
        public string AddBinary(string a, string b) {
             var result = string.Empty;
                var dataA = a.Reverse<char>().ToList();
                var dataB = b.Reverse<char>().ToList();
                var maxAry = dataA.Count > dataB.Count ? dataA : dataB;
                var degree = 0;
                for (int i = 0; i < maxAry.Count; i++)
                {
                    var j = 0;
                    var k = 0;
                    if (i < dataA.Count)
                    {
                        j = dataA[i] - '0';
                    }
                    if (i < dataB.Count)
                    {
                        k = dataB[i] - '0';
                    }
                    var sum = j + k + degree;
                    switch (sum)
                    {
                        case 0:
                            maxAry[i] = '0';
                            degree = 0;
                            break;
                        case 1:
                            maxAry[i] = '1';
                            degree = 0;
                            break;
                        case 2:
                            maxAry[i] = '0';
                            degree = 1;
                            break;
                        case 3:
                            maxAry[i] = '1';
                            degree = 1;
                            break;
                    }
    
                }
                if (degree == 1)
                {
                    maxAry.Add('1');
                }
    
                maxAry.Reverse();
                
                for (int k = 0; k < maxAry.Count; k++)
                {
                    result += maxAry[k];
                }
                return result;
            
        }
        
    }

    其中值得一提的是,我将容器由Array换成List之后,速度提升了近30ms,跑出了此题C#解答的最好纪录。

  • 相关阅读:
    android开发聊天输入框at某人的分隔符选取
    使用curl下载小文件的方法记录一下
    google play store注意事项
    android开发使用setOnClickListener点击事件实现双击事件的解决方法
    mac下Android Studio配置文件的路径记录一下
    android studio更新到3.6以上后布局文件不能切换到xml编辑器?那就点进来吧
    mac上使用Xcode编译调试LearnOpenGL源代码的方法
    android开发fragment里面使用百度地图黑屏错位的解决方法
    es7之修饰器
    解决 bash: vue command not found
  • 原文地址:https://www.cnblogs.com/mantgh/p/4707730.html
Copyright © 2011-2022 走看看