LeetCode 简单难度_第三周总结

38. 报数

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1、1
2、11
3、21
4、1211
5、111221

1 被读作 “one 1” (“一个一”) , 即 11
11 被读作 “two 1s” (“两个一”), 即 21
21 被读作 “one 2”, “one 1” (“一个二” , “一个一”) , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项

注意:整数顺序将表示为一个字符串

示例 1:
输入: 1
输出: “1”

示例 2:
输入: 4
输出: “1211”

public String countAndSay(int n) {
    if (n <= 0) {
        throw new IllegalArgumentException("n 必须为正整数");
    }
    String srcStr = "1";
    String tempStr = "";
    int count = 0;
    while (n - 1 > 0) {
        for (int i = 0; i < srcStr.length(); i++) {
            char i_c = srcStr.charAt(i);
            count = 1;
            for (int j = i + 1; j < srcStr.length(); j++) {
                char j_c = srcStr.charAt(j);
                if (i_c == j_c) {
                    count++;
                    i = j;
                } else {
                    break;
                }
            }
            tempStr = tempStr + count + i_c;
        }
        srcStr = tempStr;
        tempStr = "";
        n--;
    }
    return srcStr;
}

53. 最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和

示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6

进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解

public int maxSubArray1(int[] nums) {
    if (nums== null) {
        throw new IllegalArgumentException("nums is null");
    }
    if (nums.length == 0) {
        throw new IllegalArgumentException("nums's length is 0");
    }
    // 当前最大和
    int result = Integer.MIN_VALUE;
    // 相加的总和
    int sum = 0;
    int max = Integer.MIN_VALUE;
    int j = -1;
    if (nums.length == 1) {
        result = nums[0];
    } else {
        // 获取第一个大于 0 的数组下标 j 和对应值 sum
        for (int i = 0; i < nums.length; i++) {
            if (max < nums[i]) {
                max = nums[i];
            }
            if (nums[i] > 0) {
                j = i;
                sum = nums[i];
                break;
            }
        }
        if (j == -1) {
            result = max;
        } else {
            j++;
            result = sum;
            for (; j < nums.length; j++) {
                if (nums[j] < 0) {
                    if (sum + nums[j] < 0) {
                        sum = 0;
                    } else {
                        sum += nums[j];
                    }
                } else {
                    if (nums[j] > 0) {
                        sum += nums[j];
                    }
                }
                if (sum >= result) {
                    result = sum;
                }
            }
        }
    }
    return result;
}

58. 最后一个单词的长度

给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度
如果不存在最后一个单词,请返回 0

说明:一个单词是指由字母组成,但不包含任何空格的字符串

示例:
输入: “Hello World”
输出: 5

public int lengthOfLastWord(String s) {
    if (s == null || s.length() == 0) {
        return 0;
    }
    String[] strs = s.split(" ");
    if (strs.length == 0) {
        return 0;
    }
    return strs[strs.length - 1].length();
}

61.加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字
你可以假设除了整数 0 之外,这个整数不会以零开头

示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123

示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321

public int[] plusOne(int[] digits) {
    if (digits == null || digits.length == 0) {
        return null;
    }
    int i = digits.length - 1;
    boolean isAdd = false;
    while (i >= 0) {
        if (digits[i] == 9 && !isAdd) {
            digits[i] = 0;
            if (i - 1 >= 0) {
                digits[i - 1] += 1;
                isAdd = true;
                if (digits[i - 1] == 9) {
                    break;
                }
            } else {
                int[] destArr = new int[digits.length + 1];
                System.arraycopy(digits, 0, destArr, 0, digits.length);
                destArr[0] = 1;
                return destArr;
            }
        } else if (digits[i] == 10) {
            digits[i] = 0;
            if (i - 1 >= 0) {
                digits[i - 1] += 1;
                isAdd = true;
            } else {
                int[] destArr = new int[digits.length + 1];
                System.arraycopy(digits, 0, destArr, 0, digits.length);
                destArr[0] = 1;
                return destArr;
            }
        } else if (i == digits.length - 1) {
            digits[i] += 1;
            break;
        }
        if (i == 0) {
            break;
        }
        i--;
    }
    return digits;
}

67.二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)
输入为非空字符串且只包含数字 1 和 0

示例 1:
输入: a = “11”, b = “1”
输出: “100”

示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”

public String addBinary(String a, String b) {
    if (a ==null || b == null) {
        return "";
    }
    if (a.length() == 0) {
        if (b.length() == 0) {
            return "";
        }
        return b;
    } else if (b.length() == 0) {
        if (a.length() == 0) {
            return "";
        }
        return a;
    }
    char[] acs = a.toCharArray();
    char[] bcs = b.toCharArray();
    int acs_len = acs.length;
    int bcs_len = bcs.length;
    StringBuilder sb = new StringBuilder();
    int more_len = Math.max(acs_len, bcs_len);
    char add = '0';
    for (int i = 0; i < more_len; i++) {
        char ac = i < acs_len ? acs[acs_len - 1 - i] : '0';
        char bc = i < bcs_len ? bcs[bcs_len - 1 - i] : '0';
        char cadd = ac == bc ? '0' : '1';
        char cs = cadd == add ? '0' : '1';
        if (ac == '1' && bc == '1' || cadd == '1' && add == '1') {
            add = '1';
        } else {
            add = '0';
        }
        sb.append(cs);
    }
    if (add == '1') {
        sb.append(add);
    }
    return sb.reverse().toString();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值