2021-07-06算法题

  1. 最后一个单词的长度(*)


    image.png

    思路:先用trim()去掉首尾的空格。然后从后往前找倒数第一个空格,如果没有找到,说明只有一个单词,直接返回s的长度即可;如果找到了,就返回s.length() - 1 - i即为最后一个单词的长度

class Solution {
    public int lengthOfLastWord(String s) {
        s = s.trim();
        int i = s.length() - 1;
        while (i >= 0 && s.charAt(i) != ' ')
            i--;
        if (i == -1) {
            return s.length();
        } else {
            return s.length() - 1 - i;
        }
    }
}
  1. 加一


    image.png

    思路:从最低位开始遍历,我们使用一个变量jinwei表示上一个位置的进位,初始值为 1,每一位的结果位a[i]+b[j]+jinwei mod 10,下一位的进位为a[i]+b[j]+jinwei/10。结束后若digits[0]等于0,则重新开辟一个数组并置首位为1 。

class Solution {
    public int[] plusOne(int[] digits) {
        int temp;
        int jinwei = 1;
        for (int i = digits.length - 1; i >= 0; i--) {
            temp = (digits[i] + jinwei) % 10;
            jinwei = (digits[i] + jinwei) / 10;
            digits[i] = temp;
        }
        if (digits[0] == 0) {
            int a[] = new int[digits.length + 1];
            a[0] = 1;
            for (int i = 1; i < a.length; i++) {
                a[i] = 0;
            }
            return a;
        } else {
            return digits;
        }
    }
}
  1. 二进制求和(*)


    image.png

    思路:从最低位开始遍历,我们使用一个变量jinwei表示上一个位置的进位,初始值为 0,每一位的结果位a[i]+b[j]+jinwei mod 2,下一位的进位为a[i]+b[j]+jinwei/2。将结果位不断加到字符串中,最后倒置即可。
    我的解答:

class Solution {
    public String addBinary(String a, String b) {
        int temp;
        int jinwei = 0;
        String s = "";
        String result = "";
        int i = a.length() - 1, j = b.length() - 1;
        while (i >= 0 && j >= 0) {
            temp = ((a.charAt(i)-'0') + (b.charAt(j)-'0') + jinwei) % 2;//char-‘0’可变为数字
            jinwei = ((a.charAt(i)-'0') + (b.charAt(j)-'0') + jinwei) / 2;
            s += temp;
            i--;
            j--;
        }
        if (i == -1) {
            while (j >= 0) {
                temp = (b.charAt(j) - '0' + jinwei) % 2;
                jinwei = (b.charAt(j) - '0' + jinwei) / 2;
                s += temp;
                j--;
            }
            if (jinwei != 0) {
                s += 1;
                jinwei = 0;
            }
        }
        if (j == -1) {
            while (i >= 0) {
                temp = (a.charAt(i) - '0' + jinwei) % 2;
                jinwei = (a.charAt(i) - '0' + jinwei) / 2;
                s += temp;
                i--;
            }
            if (jinwei != 0) {
                s += 1;
            }
        }
        for (int k = s.length() - 1; k >= 0; k--) {
            result += s.charAt(k);
        }
        return result;
    }
}

官方解答:
官方的解答使用一个变量i,初始为长度最大的二进制串。然后从后往前不断将两个二进制串的每一位相加求余求进位。这个方法的特点是将位数少的二进制串中少的那几位当作0来对待

class Solution {
    public String addBinary(String a, String b) {
        StringBuffer ans = new StringBuffer();

        int n = Math.max(a.length(), b.length()), carry = 0;
        for (int i = 0; i < n; ++i) {
            carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
            carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
            ans.append((char) (carry % 2 + '0'));
            carry /= 2;
        }

        if (carry > 0) {
            ans.append('1');
        }
        ans.reverse();

        return ans.toString();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容