java编写)"/>
二进制求和(java编写)
题目要求
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
Related Topics 数学 字符串
解题思路
1.(取出两个数字组中最小长度的值)从尾数开始相加,加到这个位置为止
2.如果两个位置相同,判断是否要进位,有的话,多加一位
3.当不需要进位的时候,返回的数值是两个数组中较长多余的数字部分+之前运算的结果
4.如果需要进位,则继续按照剩余部分于进位相加减
代码如下
class Solution {public static String addBinary(String a, String b) {int alen=a.length();int blen=b.length();int maxlen=Math.max(alen,blen);int minlen=Math.min(alen,blen);StringBuilder sb=new StringBuilder();int flag=0;for(int i=minlen-1;i>=0;i--){int sum=a.charAt(--alen)-'0'+b.charAt(--blen)-'0'+flag;if(sum==0){sb.append(0);flag=0;}if(sum==1){sb.append(1);flag=0;}if(sum==2){sb.append(0);flag=1;}if(sum==3){sb.append(1);flag=1;}}if(maxlen==minlen&&flag==1){sb.append(1);return sb.reverse().toString();}if(flag==0){String res=sb.reverse().toString();if(a.length()>b.length())res=a.substring(0,maxlen-minlen)+res;elseres=b.substring(0,maxlen-minlen)+res;return res;}if(a.length()>b.length()){for(int i=maxlen-minlen-1;i>=0;i--){if(a.charAt(i)-'0'==1&&a.charAt(i)-'0'==flag){sb.append(0);flag=1;}else {sb.append(a.charAt(i)-'0'+flag);flag=0;}}if(flag==1)sb.append(1);}else{for(int i=maxlen-minlen-1;i>=0;i--){if(b.charAt(i)-'0'==1&&b.charAt(i)-'0'==flag){sb.append(0);flag=1;}else {sb.append(b.charAt(i)-'0'+flag);flag=0;}}if(flag==1)sb.append(1);}return sb.reverse().toString();}
}
效果:
info
解答成功:
执行耗时:3 ms,击败了57.90% 的Java用户
内存消耗:37.6 MB,击败了50.43% 的Java用户
补充
解题第四步可以优化
继续通过后位于进位运算,遇到0的时候停下判别
更多推荐
二进制求和(java编写)
发布评论