博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode手记-Add Binary
阅读量:6949 次
发布时间:2019-06-27

本文共 2543 字,大约阅读时间需要 8 分钟。

问题描述

 

 

 

 

 

 

 

 

 

 

 

 

问题分析

 

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

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
().ToList(); var dataB = b.Reverse
().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#解答的最好纪录。

 

 

转载地址:http://spkil.baihongyu.com/

你可能感兴趣的文章
sql server的并发性
查看>>
windows php启动浏览器
查看>>
CPP_类模板与模板类
查看>>
用CocoaPods做iOS程序的依赖管理
查看>>
虚拟机的类加载机制
查看>>
登录判断跳转页面
查看>>
多线程IO操作(扫描文件夹并计算总大小)
查看>>
读UNIX编程艺术(一)
查看>>
oracle存储过程获取异常信息码和异常信息
查看>>
大系统小做培训总结
查看>>
Web Service 那点事儿(3)—— SOAP 及其安全控制
查看>>
一步步制作rpm包
查看>>
App支付签名错误
查看>>
kali linux虚拟wifi搭建
查看>>
jquery设置元素的readonly和disabled
查看>>
监控文件是否被修改
查看>>
Linux学习笔记:Rsync
查看>>
转:APK Crack
查看>>
Beanstalkd协议 二(任务的生命周期)
查看>>
jvisualvm远程监控 visualgc插件 不受此jvm支持问题
查看>>