第一题
题目
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 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的前面的数组造成覆盖不好处理,所以,从后面开始遍历
代码
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 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
思路
比如:第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;
}
优化方法
对称的,只要算出一半就可以