22.3.28-22.4.10 (本周作业)

本文概述了四个Java实现的LeetCode题目:两数之和、判断链表环、三数之和和环形链表II的解决方案,涉及哈希表、双指针等技巧。深入解析了创建对象的JVM流程和数据结构的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

* 两数之和 https://leetcode-cn.com/problems/two-sum/

* 判断链表是否有环 https://leetcode-cn.com/problems/linked-list-cycle/

* ==*三数之和== https://leetcode-cn.com/problems/3sum/

* 环形链表2 https://leetcode-cn.com/problems/linked-list-cycle-ii/

2. 创建一个对象的详细流程?(JVM相关)


1. 算法题

简单

* 两数之和 https://leetcode-cn.com/problems/two-sum/

class Solution {
    public int[] twoSum(int[] nums, int target) {
         //1.获取数组长度
        int len = nums.length;
        //2.构建hash表
        Map<Integer,Integer> hashMap = new HashMap<>(len - 1);
        //3.第一个数肯定在哈希表中
        hashMap.put(nums[0],0);
        //4.从第二个数开始循环遍历,在Hash表中找出它的taget值
        for (int i = 1; i < len; i++) {
            //在hash表中存在就取出来
            if (hashMap.containsKey(target - nums[i]))
            {
                return new int[]{hashMap.get(target - nums[i]),i};
            }
            
            //5.不存在就添加进hash表
            hashMap.put(nums[i],i);
        }
        
        throw new RuntimeException("不存在两数之和");

    }
}

* 判断链表是否有环 https://leetcode-cn.com/problems/linked-list-cycle/

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        //1.首先创建一个哈希表用于保存已经访问过得
        Set<ListNode> set = new HashSet<ListNode>();
        //2.当链表不为空时
        while(head != null)
        {
            //3.遍历并判断是否添加成功
            if(!set.add(head))
            {
                //4.添加失败,返回true,说明是个环形链表
                return true;
            }
            //5.添加成功的话,则一直往后面遍历
            head = head.next;
        }
        //6.遍历完,还没有找到和哈希表中相同的数据则返回false
        return false;
    }
}

中等

* ==*三数之和== https://leetcode-cn.com/problems/3sum/

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //1.创建ArrayList对象,用于返回
        List<List<Integer>> ans = new ArrayList<>();
        //2.获取数组长度,判空校验
        int len = nums.length;
        if (nums == null || nums.length < 3) return ans;
        //3.将数组进行排序
        Arrays.sort(nums);
        //4.循环遍历
        for (int i = 0; i < len; i++) {
            //5.如果当前数字大于0,则三数之和一定大于0,所以循环结束
            if (nums[i] > 0) break;
            //6.去重
            if (i > 0 && nums[i] == nums[i - 1]) continue;//去重
            //7.双边指针,L = i + 1,R = len - 1.
            int L = i + 1;
            int R = len - 1;
            //8.双边循环,L >= R就退出
            while (L < R)
            {
                //9.计算三数之和
                int sum = nums[i] + nums[L] + nums[R];
                //10.判断nums是否等于0
                if (sum == 0)
                {
                    //11.添加到List集合里面
                    ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    //12.进行双指针的前后去重
                    while (L < R && nums[L] == nums[L+1]) L++;
                    while (L < R && nums[R] == nums[R-1]) R--;
                    L++;
                    R--;
                }
                //13.说明左指针指的数和i位置的相加的负数太大
                else if (sum < 0) L++;
                else if (sum > 0) R--;
            }
        }
        return ans;
    }
}

* 环形链表2 https://leetcode-cn.com/problems/linked-list-cycle-ii/

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        //1.首先创建一个哈希表
        Set<ListNode> set = new HashSet<ListNode>();
        //2.用一个临时节点去保存当前节点
        ListNode tempNode = head;
        //3.遍历当前链表
        while(tempNode != null){
            //5.判断当前哈希表是否包含遍历的节点
            if(set.contains(tempNode))
            {
                return tempNode;
            }else
            {
                set.add(tempNode);
            }
            tempNode = tempNode.next;
        }
        //4.无环返回null
        return null;
    }
}

2. 创建一个对象的详细流程?(JVM相关)

  1. 加载.class文件,执行类加载过程
  2. 栈内存开辟内存空间,存放对象的引用变量p
  3. 堆内存开辟内存空间,存放对象
  4. 对成员变量进行默认初始化
  5. 对成员变量进行显示初始化
  6. 执行构造方法
  7. 堆内存完成
  8. 把堆内存的地址赋值给引用变量p

hardfault_handler(硬件错误处理函数)是一种常见的嵌入式系统中的异常处理机制,用于处理当发生特定的硬件错误时,保护系统免受崩溃或不可预测行为的影响。然而,硬件错误的原因往往是复杂而多样的,因此很难将hardfault_handler的故障归咎于一个单一的真凶。 硬件错误可能的来源包括但不限于内存出错、指令错误、算术错误、栈溢出、总线错误等。这些错误的发生可能是由于硬件故障、电压噪声、电磁干扰、程序设计错误等多种因素的综合作用。 在嵌入式系统中,除了硬件错误之外,软件程序错误也可能导致hardfault_handler的触发。例如,非法指令、空指针引用、数组越界、递归溢出等等。这些软件错误可能是由于编程错误、内存管理错误、数据类型不匹配等原因造成的。 因此,将hardfault_handler的真凶归结于一个单一的因素是不准确的。硬件错误的发生可能是由多重因素引起的,这需要进行详细的故障分析和排除。在排查硬件错误时,可以进行硬件测试、检查电路连接、测量电压和电流等方法;而在排查软件错误时,可以通过调试、日志记录、代码审查等手段来找出程序中的错误。 总之,hardfault_handler的真凶往往是硬件错误和软件错误的综合结果,需要综合多方面的因素来进行分析和解决。通过合理的硬件设计和软件编程,可以减少硬件错误和软件错误的发生,提高系统的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值