问题缘由
LeetCode:杨辉三角:
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
首先附上题解
class Solution { C++环境
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> a(numRows);
if(numRows == 0)
return a;
for(int i = 0; i < numRows; i++)
for(int j = 0; i >= j; j++){
if(i == j || j == 0)
a[i].push_back(1);
else
a[i].push_back(a[i-1][j-1] + a[i-1][j]);
}
return a;
}
};
class Solution { Java环境
public List<List<Integer>> generate(int numRows) {
List<List<Integer>> list = new ArrayList();
for(int i = 0 ; i < numRows ; i++){
List<Integer> numList = new ArrayList();
for(int j = 0 ; j <= i ; j++){
if( j == 0 || j == i){
numList.add(1);
}else{
numList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
}
}
list.add(numList);
}
return list ;
}
}
题目定义了一个数组方法,使用vector来创建目标结果,题解过程遇到的问题包含:
- C++
- Java
- 1.引用错误4 ——java.arrayslist中arrayslist并不是一个数组类型,对其元素的引用需要使用get()方法
问题处理
- C++
直接定义的数组不可以返回指针给使用容器定义的数组。
容器定义的数组不可以用a[][]形式进行增减元素,需使用自身的函数。
特殊情况直接排除。(空数组) - Java
元素引用使用包含的方法(需要使用get()方法从ArrayList中获取特定索引处的元素不能使用[]在ArrayList中的特定索引处获取元素。它只能用于数组,而文件不是数组,而是ArrayList。)
容器使用
C++——Vector(允许数组形式的直接下角标访问与“已存在元素”修改,而增减元素调用方法)
vector 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或添加元素。
- 声明&创建
vector < double > values;声明一个valve名的容器
values.reserve(size);重定义容器容量。容器容量和容器大小的区别
values.resize(size,N);重定义元素数量。会用默认值填充
vector< double > values(size);创建一个容量为size的默认值均为0的容器
vector< double > values {N};创建一个容器含有一个元素N
vector< double > values(size, N);创建一个容量为size的默认值均为N的容器 - 常用方法
size();获取当前数组的大小,对于二维数组需使用例如nums.size(),nums[0].size()分别获取行列大小
sort(values.begin(),values.end());对当前数组begin到end范围进行排列从小到大
capacity();
swap(n,m);交换n和m的值
front();获取数组第一个元素值
back()获取;数组最后一个元素
at(index);索引目标位置,但不会越界
push_back();向数组尾部添加一个元素
pop_back();从数组尾部去掉一个元素
emplace(Po,int,E); 向Po位置插入int个元素E
insert(Po,E);向Po位置插入一个元素E
insert(Po,P1,P2);在Po位置插入另一个序列从P1到P2位置的多个变量
insert(Po,int,E);向Po位置插入int个元素E
erase(Po,P1);删除某个位置的元素或者某个范围的元素
remove(Po,P1,E);删除Po到P1范围内的E
clear();清空数组
Java——ArrayList(访问与任何修改均需调用方法)
可调整大小的数组的实现List接口。 实现所有可选列表操作,并允许所有元素,包括null 。 除了实现List 接口之外,该类还提供了一些方法来操纵内部使用的存储列表的数组的大小。 (这个类是大致相当于Vector,不同之处在于它是不同步的)。
- 声明&创建
List< Integer> list = new ArrayList();
ArrayList[] arrayList = new ArrayList[n];
ArrayList<String[]> arrayList = new ArrayList(); - 常用方法
void Arrays.sort(N,M);交换元素
boolean add(E e) 将指定的元素追加到此列表的末尾。
void add(int index, E element) 在此列表中的指定位置插入指定的元素。
boolean addAll(Collection<? extends E> c) 按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中,从指定的位置开始。
void clear() 从列表中删除所有元素。
Object clone() 返回此 ArrayList实例的浅拷贝。
boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
E get(int index) 返回此列表中指定位置的元素。
int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
boolean isEmpty() 如果此列表不包含元素,则返回 true 。
Iterator iterator() 以正确的顺序返回该列表中的元素的迭代器。
int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
E remove(int index) 删除该列表中指定位置的元素。
boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
boolean removeAll(Collection<?> c) 从此列表中删除指定集合中包含的所有元素。
boolean removeIf(Predicate<? super E> filter) 删除满足给定谓词的此集合的所有元素。
protected void removeRange(int fromIndex, int toIndex) 从这个列表中删除所有索引在 fromIndex (含)和 toIndex之间的元素。
boolean retainAll(Collection<?> c) 仅保留此列表中包含在指定集合中的元素。
E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
int size() 返回此列表中的元素数。
void sort(Comparator<? super E> c) 使用提供的 Comparator对此列表进行排序以比较元素。
Object[] toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
T[] toArray(T[] a) 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。
-
if(i > 1 && j > 1) a[i].push_back(a[i-1][j-1] + a[i-1][j]);
执行状态:执行出错
我的输入:5
我的答案:AddressSanitizer: heap-buffer-overflow on address 0x602000000098 at pc 0x000000405b25 bp 0x7ffdcd2e9190 sp 0x7ffdcd2e9188 -
(找不到为啥了)
执行状态:执行出错
我的输入:5
我的答案:error: no match for ‘operator+=’ (operand types are ‘std::_Vector<Vectorr’ and ‘int’) -
vector<vector> a(numRows)
if(numRows == 0)
return a;
for(int i = 0; i < numRows; i++)
for(int j = 0; i >= j; j++){
if(i == j || j == 0)
a[i].push_back(1)
else
a[i].push_back(a[i-1][j-1] + a[i-1][j]);
}
return a;
执行状态:执行出错
我的输入:5
我的答案:Line 922: Char 34: runtime error: reference binding to null pointer of type ‘value_type’ (stl_vector.h) -
numList.add(list.get(i-1).get(j-1)+list.get(i-1).get(j));
执行状态:执行出错
我的答案:error: array required, but ArrayList< > found