美文网首页
leetcode 67. 二进制求和 解题思路

leetcode 67. 二进制求和 解题思路

作者: 问君西游何时还 | 来源:发表于2020-06-25 15:57 被阅读0次

闲太久了,前两天又开始重新刷题啦,就从leetcode上的每日一题开始吧。

67. 二进制求和:

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。

说明:

拆分时可以重复使用字典中的单词。
你可以假设字典中没有重复的单词。

示例 1:

输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:

输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。

示例 3:

输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

解题思路

首先取a,b中较长一方的长度,新建一个数据,用来保存求和(不用担心溢出,最后会说)。然后设置一个left变量用来保存进位,开始从双方末尾开始相加,计算a[i]+b[i]+left,sum[i]为计算出来的和对2取余,left重新赋值为计算出来的和除以2。一直相加到第一位为止,此时如果进位为0,直接返回sum,如果进位为1,返回“1”+sum。
注意在计算过程中不要数组越界,取数前先判断一下。

总的这道题比较简单,之前想用位运算来做但是发现还是要保存进位,但是发现还是要保存进位,和现在的方法没有区别。也可能是我想歪了,欢迎各位大佬指正。

下附java代码仅供参考:

public class SumOfTwobinary67 {
    public static void main(String[] args) {
        System.out.println(addBinary("01100", "111000"));
    }

    public static String addBinary(String a, String b) {
        char[] as = a.toCharArray();
        char[] bs = b.toCharArray();
        int maxLeng = as.length > bs.length ? a.length() : b.length();
        char[] sum = new char[maxLeng];
        int left = 0;
        for (int i = 0; i < maxLeng; i++) {
            int cur = 0;
            if (a.length() - i > 0) {
                cur += as[a.length() - i - 1] - '0';
            }
            if (b.length() - i > 0) {
                cur += bs[b.length() - i - 1] - '0';
            }
            cur += left;
            left = cur / 2;
            sum[maxLeng - i - 1] = (char) (cur % 2 + '0');
        }
        if (left == 0) {
            return String.copyValueOf(sum);
        } else {
            return "1" + String.copyValueOf(sum);
        }
    }
}

相关文章

网友评论

      本文标题:leetcode 67. 二进制求和 解题思路

      本文链接:https://www.haomeiwen.com/subject/ykvyzttx.html