数组-day02-66/88/118

91 阅读2分钟

第一题

题目

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

思路

一看,就想到全是9怎么办,这种情况要单拎出来 因为加法嘛,要从最后一位开始加,所以数组要从右向左遍历,只要找到非9的,说明我们就可以直接加,然后不用数组多加长度了

所以,从右向左遍历,找到第一个非9的,这个value加一,这个value向右的所有的都至为0 全是9,怎么办,length+1,然后第一位为1,剩余全是0;

代码

import java.util.Arrays;
class Solution {
    public int[] plusOne(int[] digits) {
        Boolean flag = false;
        for(int i = digits.length - 1; i > -1; i--) {
            if(digits[i] != 9) {
                digits[i] = digits[i] + 1;
                for(int j = i + 1; j < digits.length; j++){
                    digits[j] = 0;
                };
                break;
            }else {
                if(i == 0) {
                    flag = true;
                    break;
                };
            };
        };
        if(flag) {
            int[] newData = new int[digits.length + 1];
            Arrays.fill(newData, 0);
            newData[0] = 1;
            return newData;
        }else {
            return digits;
        }
    };
}

不好

这么写说明一定要遍历完,内存占用上升,看了大佬的代码思路,感觉更好点

别人的代码

public int[] plusOne(int[] digits) {
    for (int i = digits.length - 1; i >= 0; i--) {
        digits[i]++;
        digits[i] = digits[i] % 10;
        if (digits[i] != 0) return digits;
    }
    digits = new int[digits.length + 1];
    digits[0] = 1;
    return digits;
}

第二题

题目

给你两个按 非递减顺序 排列的整数数组 nums1 **和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 **到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

思路

从开始遍历,对于数组1的前面的数组造成覆盖不好处理,所以,从后面开始遍历

image.png

代码

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m-1;
        int j = n-1;
        int len = nums1.length - 1;
        while(j>= 0) {
            if(i >= 0 && nums1[i] > nums2[j]) {
                nums1[len] = nums1[i];
                i--;
            }else {
                nums1[len] = nums2[j];
                j--;
            };
            len--;
        };
    }

代码释义

遍历,第二个数组遍历结束,也就是说明数据穿插结束,所以外层判断用数组二的length
内层也要判断数组一的index,不能超出范围啊

第三题

题目

给定一个非负整数 numRows 生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

image.png

思路

比如:第n行的第m个数的value等于第n-1行的第m-1个数的value加上第n-1行的第m个数的value 深入理解上面这个就差不多了

代码

    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> newArr = new ArrayList<List<Integer>>();
        for(int i = 0; i < numRows; ++i) {
            List<Integer> list = new ArrayList<Integer>();
            for(int j = 0; j <= i; ++j) {
                if(j == 0 || j == i) {
                    list.add(1);
                }else {
                    list.add(newArr.get(i-1).get(j-1) + newArr.get(i-1).get(j));
                }
            }
            newArr.add(list);
        };
        return newArr;
    }

优化方法

对称的,只要算出一半就可以