JAVA学习总结

力扣题:

一、

思路:

删除链表的第N个结点,即删除第(个数-N+1)个数,找到它前一个结点的位置,改变指针指向的位置,进行删除操作。

方法:

1、建立sum链表指向head,用于记录结点总数。即从head开始遍历,每经过一个结点count+1,直到head.next为空。

2、建立dl链表指向head,用于找到并删除指定元素。即设置变量x表示找到第x+1个数,因为要找到要删除数的前一个数,所以x=count-N+1-1-1。利用循环找到要删除数的前一个数的结点。将它的指针指向下一个数指针所指向的位置来删除。

3、返回删除后的head。

代码实现:

/**
 * 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 removeNthFromEnd(ListNode head, int n) {
            ListNode sum=head;//记录节结个数
            ListNode dl=head;//查询删除节点的前一个节点
            int count=1;//计数器
            if(head==null || head.next==null){
                return null;
            }

            while( sum.next!=null){
 
                sum=sum.next;
               count++;
            }
            if(count == n)
            {
                head = head.next;
                return head;
            }
            int x=count-n-1;
 
            while(x!=0){
                x--;
                dl=dl.next;

            }
            dl.next=dl.next.next;
            return head;
        }
    }

二、

思路:

遍历整个链表,将所有元素向后移动一位,再将整个过程重复k次

方法:

1、判断:若链表为空,则直接返回链表

2、创建sum链表用于实现将所有元素向后移动一位。

即:设置while(true)循环,先获取头结点的数据result,之后先获取下一个结点的数据num,再将result赋值给下一个结点,将num赋值给result用于下一次结点的赋值,最后移动到下一个结点。

用if语句判断是否到最后一个结点,若到达最后一个结点就将sum重新指向head头指针,将上一次获得的最后一个结点的数据赋值给头结点,结束循环。

4、设置length链表,遍历链表得到结点总数count,利用k%count取得移动次数,节省时间。

3、将2循环k%count次得到结果,返回head。

代码实现:

/**
 * 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 rotateRight(ListNode head, int k) {
    ListNode sum=head; 
    ListNode length=head;
    int count=1;

    if(sum==null){
        return head;
    }
    while(length.next!=null){
      length=length.next;
      count++;
    }
     for(int i=0;i<k%count;i++){
        int result=sum.val;
        while(true){

            if(sum.next==null){
 

           sum=head;
            sum.val=result;
            break;
            }
        int num=sum.next.val;
        sum.next.val=result;
        result=num;
        sum=sum.next;
        
        }
        
     }
     return head;
    }
}

三、

思路:

先将目标数字与最后一列的数进行比较,找到目标数字在第几行。再将该行进行二分查找,找到则返回true,找不到则返回false。

方法:

1、遍历数组最后一列,将其与目标数字比较,若大于target则结束循环,若小于则h+1,继续下一行,直到最后一行

2、利用二分查找匹配目标数字,若找到则返回true,没找到返回false。

代码实现:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
     int h=0;//记录所在的行
     int hsum=matrix.length;//记录总行数
     int lsum=matrix[0].length;//记录总列数
     while(target>matrix[h][lsum-1]){
        h++;
        if(h>hsum-1)
        return false;
     }
    
    //二分查找
     int low=0;
     int top=lsum-1;
     while(low<=top){
     int mid=(low+top)/2;
     if(matrix[h][mid]==target)
     return true;
     if(matrix[h][mid]>=target){
     top=mid-1;   
     }
     if(matrix[h][mid]<=target){
        low=mid+1;
     }
     

    }
        return false;
    }
}

知识点:

System(系统)

1、public static void exit (int status->状态码)       终止虚拟机

2、                    long currentTimeMillis()         返回当前时间毫秒值形式

1秒=1000毫秒=1000000微秒

3、                   void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数)                    数组拷贝

细节:1、若两数组都是基本数据类型,则二者类型必须保持一致。

2、若两数组都是引用数据类型,则子类可赋值父类(要强转)

Runtime

方法:

1、public static Runtime getRuntime()        当前系统运行环境对象

2、public void exit(int status)                       停止虚拟机

3、public int availableProcessors                     获取CPU线程数

4、public long maxMemory()                       JVM从系统中获取内存表大小

5、public long totalMemory()

6、public long freeMemory()

7、public Process exec()                             运行cmd命令

Object(java中顶级父类)

仅有空参构造

方法:

1、public static toString                   返回对象字符串形式

若想看到对象属性值,则将toString重写

2、           boolean equals()         比较对象

若要比较对象属性值要重写

3、protected Object clone()         对象克隆

要重写clone

Objects

equals(a,b)     先非空判断 后比较

isNull()              判断是否为空

nonNull()          判断是否非空

BigInteger(操作超出long的数)

1、BigInteger(int num,Random r)    获取随机大整数,范围 0到2的nu次方-1

2、BigInteger(String val)                    获取指定大整数

3、BigInteger valueOf(long val)

对-16到16优化,提前创建对象,多次获取不在创建

BigDecimal(小数的精确计算)

new BigDecimal(“小数”);   精确记录小数方法

divide(BigDecimal val ,精确几位,舍入模式)   除法小数的保留

正则表达式

作用:

1、校验字符串是否满足规则

2、查找满足要求的内容(爬虫)

字符类

[a,b,c],

[^a,b,c]

[a-zA-Z]

[a-d[m-p]]

&&

|

预定义字符

\d     一个数字

\D    非数字

\s      一个空白字符

\S     非空白字符

\w     大小写字母,_,数字

\W    非单词字符

数量词

?   一次或零次

*     零次或多次

+     一次或多次

{n}  n次

{n,}   至少n次

{n,m}    到m次n

爬虫:

Pattern类:表示正则表达式

Matcher:文本适配器

find方法:判断是否存在适配文本

group方法:截取适配文本

有条件的爬取:

?=     ?:       ?!

非贪婪爬取:在+*之后加上?即可

public String replaceAll(String ,String )        按照正则表达式规则替换

public String[]split()                                          按照正则表达式切割字符串

非捕获分组(?=     ?:       ?!)

特点:仅仅将数据括起来,不占用组号

捕获分组:(将这一组数据捕获出来再用一次)

用数字代表组号,例://1。

若在正则外需要组号 用$。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值