首页 > 其他分享 >力扣刷题笔记

力扣刷题笔记

时间:2024-09-22 15:16:39浏览次数:1  
标签:ListNode cur temp nums 笔记 next 力扣 null 刷题

有序数组的平方:

我的错误解法:

public class Test {
    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {-5,-3,-2,-1};

        System.out.println(Arrays.toString(s.removeElement(nums)));;
    }
}

class Solution {
    public int[] removeElement(int[] nums) {
        int min = 0;
        int max = nums.length-1;
        while (min != max){
            if(Math.abs(nums[min]) > Math.abs(nums[max])){
                int temp = nums[max];
                nums[max] = (int)Math.pow(nums[min],2);
                nums[min] = temp;
                max --;
            }else{
                nums[max] = (int)Math.pow(nums[max],2);
                max --;
            }
        }
        nums[min] = (int)Math.pow(nums[min],2);
        return nums;
    }
}

在我自己的这种解法中,在一些数组中并不适用。比如这里的例子-5,-3,-2,-1.

第一轮nums[3]=25,nums[0]=-1。而第二轮直接用-1和-2比较,中间的-3其实才是最大的数,所以错误。

这也是为什么解答答案中必须用一个新数组去记录的原因!

 移除链表元素

 这里有两个地方要注意

1.怎么处理头节点,如果不加入虚拟头节点那么就要分两种情况去删除元素:判断是否为头节点

2.空指针异常的警告问题

我的错误代码:

 在这里 我们应该写:

while (head != null && head.val == val) while(temp != null && temp.next != null) 我们需要先判断一下指针是否为空,为空指针我们不能够去访问其next也不能访问其val值,否则会报错 正确写法如下:
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        while (head != null && head.val == val ){
            head = head.next;
        }
        ListNode temp = head;
        while(temp != null && temp.next != null){
            if (temp.next.val == val){
                temp.next = temp.next.next;
            }else{
                temp = temp.next;
            }
        }
        return head;
    }
}

还一种带虚拟头节点的

ListNode dummy = new ListNode();
        dummy.next = head;
        ListNode temp = dummy;
        while (temp.next != null){
            if (temp.next.val == val){
                temp.next = temp.next.next;
            }else{
                temp = temp.next;
            }
        }
        return dummy.next;

 反转链表

 双指针的方法:

首先两个需要注意的点:

① 在最开始初始化的时候pre的赋值,这里应该是赋值null,因为最开始的头结点应该变成尾结点指向空

② 在改变了next指向的时候,需要增加一个temp来保留原先的next指向的结点,避免在改变了指向之后找不到原先的下一结点。

我写的代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp = cur.next;
        while (cur != null){
            cur.next = pre;
            pre = cur;
            cur = temp;
            if (temp.next != null){
                temp = temp.next;
            }
        }
        return pre;
    }
}

但这里我本来写的

    cur.next = pre;
    pre = cur;
    cur = temp;
    temp = temp.next;

这其实是有错误的,当我的temp本来指向的就是null之后,我是没有办法遍历它的next的,会出现空指针异常

需要更改的话,其实我可以将temp指针的赋值操作提到最前面,就不会有这个问题了。

正确写法如下:

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp;
        while (cur != null){
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

还有一种写法是写成递归的形式:

这一种形式最好是在写了双指针的解法之后去更改

这里也要注意一点就是空指针异常

temp的赋值要是在if判断之前就会出现空指针异常的问题,我们如果放在了下面就避免了我们去访问null的next的问题了。

class Solution {
    public ListNode reverseList(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        return reverse(cur,pre);
    }

    public ListNode reverse(ListNode cur, ListNode pre){
        if (cur == null){
            return pre;
        }
        ListNode temp = cur.next;
        cur.next = pre;
        return reverse(temp,cur);
    }
}

 

 

 

 

 

 

 

 

 

 

标签:ListNode,cur,temp,nums,笔记,next,力扣,null,刷题
From: https://www.cnblogs.com/gjwqz/p/18416087

相关文章

  • 吴恩达机器学习课程 笔记3 多元线性回归梯度下降
    多维特征多维特征指的是在机器学习和数据分析中,每个样本不仅由单一特征描述,而是由多个不同属性或维度组成的向量。这些特征可以是连续的也可以是离散的,它们共同构成了数据集的一个样本点。多维特征的例子房屋价格预测:面积(平方米)房间数量建造年份地理位置(经度、纬度)......
  • CL260 学习笔记(五)
    Ceph用户认证与授权ceph-scephauthlist注意:不可以通过直接修改keyring文件来获得权限,否则ceph集群就变得很不安全了,真正记录权限的位置在mon组件中,而非客户端。当user8读rhca_01.txt单个对象是可以的,但要列出test1存储池中的所有对象就会被拒绝了。没有任何权限,所以不能......
  • HTB-GreenHorn 靶机笔记
    GreenHorn靶机笔记概述GreenHorn是HTB上的一个linuxeasy难度的靶机,主要是通过信息搜集和代码审计能不能找到对我们有用的信息。靶机地址:https://app.hackthebox.com/machines/GreenHorn一丶nmap扫描1)端口扫描-sT以TCP全连接扫描,--min-rate10000以最低10000......
  • ABBAC900F学习笔记330:用户权限管理、登陆注销事件记录
    某浪博客又抽风了,莫名其妙的将访问量清零了,这是赶人走的意思吧?我把那边的内容搬到这里吧,万一哪天那边关张了,辛辛苦苦的学习笔记就没了。原博客地址:ABBAC900F学习笔记330:用户权限管理、登陆注销事件记录_来自金沙江的小鱼_新浪博客(sina.com.cn)现场有几套ABBAC900F控制系统,使......
  • [数据结构与算法·C++] 笔记 1.4 算法复杂性分析
    1.4算法复杂性分析算法的渐进分析数据规模n逐步增大时,f(n)的增长趋势当n增大到一定值以后,计算公式中影响最大的就是n的幂次最高的项其他的常数项和低幂次项都可以忽略大O表示法函数f,g定义域为自然数,值域非负实数集定义:如果存在正数c和n,使得对任意的......
  • 打卡信奥刷题(780)用Scratch图形化工具信P6414[普及组/提高组] [COCI2014-2015#1] PROSJ
    [COCI2014-2015#1]PROSJEK题目描述有一个数列aaa,现在按照下列公式求出一个数列bb......
  • 学习笔记488—Acrobat设置默认页面显示方式为启用滚动
    Acrobat设置默认页面显示方式为启用滚动使用Acrobat每次打开pdf文件总是单页视图模式,需要手动选择“启用滚动”才能单页连续滚动。但是往往再次打开别的pdf文件时,又恢复到单页视图了,还是需要探索一劳永逸的设置方式解决。经过查找找到了解决方案,具体步骤如下。1、打开Acrobat,选择......
  • FFmpeg开发笔记(五十四)使用EasyPusher实现移动端的RTSP直播
    ​之前的文章《利用RTMP协议构建电脑与手机的直播Demo》介绍了如何使用RTMPStreamer实现完整的RTMP直播流程,另一篇文章《利用SRT协议构建手机APP的直播Demo》介绍了如何使用SRTStreamer实现完整的SRT直播流程,接下来介绍如何使用EasyPusher-Android实现完整的RTSP直播流程。一、......
  • 力扣最热一百题——最长公共前缀
    目录题目链接:14.最长公共前缀-力扣(LeetCode)题目描述示例提示:解法一:逐步缩减前缀Java写法:运行时间C++写法:运行时间时间复杂度和空间复杂度解法二:字典序排序什么是字典序?为什么通过字典序排序之后的首位字符串就可以找到最长公共前缀?举例说明:Java写法:运行时......
  • leetcode 算法题目学习笔记 - 序号1
    1.两数之和https://leetcode.cn/problems/two-sum/简要说明:1.给定一个数组和一个数字2.要求找到数组中某两个元素,使得他们相加等于所给数字(将所给数字拆为数组中的某两个个元素)3.以数组形式返回两个下标否则返回空指针返回的下标没有顺序要求假设有唯一解,即只能在数组中......