写了螺旋矩阵这个数组算法,一开始写的时候大概想到有四个点,然后彼此环绕做循环从而成功地实现螺旋矩阵这一效果。
class Solution {
public int[][] generateMatrix(int n) {
int[][] re = new int[n][n];
int loop = n / 2;
int num = 1;
int startx = 0;
int starty = 0;
int offset = 1; //为了维持遍历的长度,遵循左闭右开原则
int mid = n/2; //在这里判断中间的数的索引
while(loop!=0){
loop--;
int i = startx;
int j = starty;
//接下来是四个循环
for(j = starty;j < starty+n-offset; j++){
re[startx][j] = num++;
}
for(i=startx;i<startx+n-offset;i++){
re[i][j] = num++;
}
for(j=i;j>starty;j--){
re[i][j] = num++;
}
for(;i>startx;i--){
re[i][j] = num++;
}
//这里是为了第二圈开始时起始的位置都要+1
startx++;
starty++;
offset += 2; //在这里的遍历长度要-2的原因是之前遍历时走了一个数,同时要保证左闭右开原则,所以这里-2了
}
//这里也会经常漏掉,给如果n为奇数时给中间的数赋值
if(n%2!=0){
re[mid][mid] = num;
}
return re;
}
}
然后来到了链表环节,在这里有个知识点一定要记住:
- 定义数组的时候,长度是固定的,如果想改动数组的长度,则需要重新定义一个新的数组。
- 链表的长度可以是固定不变的,而且还可以动态增删,适合数据量不固定、频繁增删、较少查询的场景
链表的操作不是很熟,这个算法挺简单的,就是部分操作要熟悉点。
/**
* Definition for singly-linked list.
* public class ListNode { //这里是链表怎么定义的
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return head;
}
ListNode zun = new ListNode(-1,head);
ListNode pre = zun;
ListNode cur = head;
while(cur != null){
if(cur.val == val){
pre.next = cur.next;
}
else {
pre = cur;
}
cur = cur.next;
}
return zun.next; //因为可能涉及到头结点,你这样返回的就是一个空数组,所以才有zun的存在
}
}```