首页 > 编程语言 >必刷算法题

必刷算法题

时间:2025-01-06 09:34:09浏览次数:9  
标签:return list 算法 链表 add new 必刷 public

一、查找最大公共前缀

1.思路

  • 首先检查字符串数组是否为空或长度为0,如果是,则返回空字符串。
  • 初始化前缀为数组的第一个字符串。
  • 遍历数组中的每个字符串,逐个字符比较前缀与当前字符串,如果不匹配,则缩短前缀长度,直到找到匹配或前缀为空。
  • 返回最终的前缀

2.代码实现

public class MaxCommonPrefix { 
    /** 
     * 查找字符串数组中的最大公共前缀 
     * 
     * @param strs 字符串数组
     * @return 最大公共前缀
     */ 
    public static String findLongestCommonPrefix(String[] strs) { 
        // 如果字符串数组为空或长度为0,返回空字符串
        if (strs == null || strs.length  == 0) { 
            return "";
        } 
        
        // 初始化前缀为数组的第一个字符串
        String prefix = strs[0];
        
        // 遍历数组中的每个字符串 
        for (int i = 1; i < strs.length;  i++) {
            // 当前字符串与前缀逐个字符比较
            while (strs[i].indexOf(prefix) != 0) { 
                // 如果不匹配,缩短前缀长度 
                prefix = prefix.substring(0,  prefix.length()  - 1);
                // 如果前缀已经为空,则直接返回空字符串 
                if (prefix.isEmpty())  { 
                    return ""; 
                } 
            } 
        } 
        
        // 返回最终的前缀 
        return prefix; 
    } 
 
    public static void main(String[] args) {
        // 测试用例 
        String[] strs = {"flower", "flow", "flight"};
        System.out.println(findLongestCommonPrefix(strs));   // 输出: "fl"
    } 
}

二、 两个升序链表合并

1.思路

  • 创建一个哑节点作为合并后链表的头节点。
  • 使用两个指针分别指向两个链表的头节点。
  • 比较两个指针所指向的节点值,将较小的节点接到合并后链表的末尾,并移动该指针。
  • 当其中一个指针为空时,将另一个链表的剩余部分接到合并后链表的末尾。
  • 返回合并后链表的头节点(哑节点的下一个节点)。

2.代码实现

public class ListNodeMerger { 
    // 链表节点定义 
    static class ListNode { 
        int val; 
        ListNode next; 
        ListNode(int x) { val = x; } 
    } 
 
    /** 
     * 合并两个升序链表 
     * 
     * @param l1 第一个链表
     * @param l2 第二个链表
     * @return 合并后的链表 
     */ 
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 创建一个哑节点作为合并后链表的头节点
        ListNode dummyHead = new ListNode(0);
        // 创建一个指针用于遍历合并后链表 
        ListNode current = dummyHead;
        
        // 当两个链表都不为空时 
        while (l1 != null && l2 != null) { 
            // 比较两个链表节点的值
            if (l1.val  <= l2.val)  { 
                // 将较小值的节点接到合并后链表的末尾 
                current.next  = l1; 
                // 移动第一个链表的指针
                l1 = l1.next; 
            } else { 
                // 将较大值的节点接到合并后链表的末尾 
                current.next  = l2; 
                // 移动第二个链表的指针
                l2 = l2.next; 
            } 
            // 移动合并后链表的指针 
            current = current.next; 
        } 
        
        // 将剩余链表接到合并后链表的末尾
        if (l1 != null) {
            current.next  = l1; 
        } 
        if (l2 != null) {
            current.next  = l2; 
        } 
        
        // 返回合并后链表的头节点(哑节点的下一个节点)
        return dummyHead.next; 
    } 
 
    public static void main(String[] args) {
        // 测试用例 
        ListNode l1 = new ListNode(1);
        l1.next  = new ListNode(2); 
        l1.next.next  = new ListNode(4); 
        
        ListNode l2 = new ListNode(1);
        l2.next  = new ListNode(3); 
        l2.next.next  = new ListNode(4); 
        
        ListNode mergedList = mergeTwoLists(l1, l2);
        // 输出合并后的链表 
        while (mergedList != null) {
            System.out.print(mergedList.val  + " "); 
            mergedList = mergedList.next; 
        } 
        // 输出: 1 1 2 3 4 4 
    } 
}

三、 回收算法

1.思路

  • 创建两个列表,一个用于模拟堆内存(存放对象),一个用于存放被标记的对象。
  • 分配对象时,将其添加到堆内存中。
  • 标记对象时,将其添加到标记列表中。
  • 清除时,遍历堆内存,将未被标记的对象保留到新的堆内存中,并清空标记列表。

2.代码实现

import java.util.ArrayList; 
import java.util.List; 
 
public class GarbageCollector {
    // 模拟堆内存
    private List<Object> heap = new ArrayList<>();
    // 存放被标记的对象
    private List<Object> marked = new ArrayList<>();
 
    /** 
     * 分配对象到堆内存中 
     * 
     * @param obj 要分配的对象 
     */ 
    public void allocate(Object obj) {
        heap.add(obj); 
    } 
 
    /** 
     * 标记对象
     * 
     * @param obj 要标记的对象 
     */ 
    public void mark(Object obj) {
        marked.add(obj); 
    } 
 
    /** 
     * 清除未被标记的对象
     */ 
    public void sweep() { 
        // 新的堆内存,用于存放未被标记的对象
        List<Object> newHeap = new ArrayList<>();
        // 遍历堆内存中的每个对象
        for (Object obj : heap) { 
            // 如果对象未被标记,则保留到新的堆内存中
            if (!marked.contains(obj))  { 
                newHeap.add(obj);  
            } 
        } 
        // 更新堆内存为新的堆内存
        heap = newHeap; 
        // 清空标记列表 
        marked.clear(); 
    } 
 
    /** 
     * 获取当前堆内存中的对象 
     * 
     * @return 堆内存中的对象列表 
     */ 
    public List<Object> getHeap() { 
        return heap; 
    } 
 
    public static void main(String[] args) {
        // 测试用例 
        GarbageCollector gc = new GarbageCollector();
        gc.allocate(new  Object("Object1"));
        gc.allocate(new  Object("Object2"));
        gc.mark(gc.getHeap().get(0));   // 标记第一个对象 
        gc.sweep();   // 清除未被标记的对象 
        // 输出剩余的堆内存对象
        for (Object obj : gc.getHeap())  { 
            System.out.println(obj); 
        } 
        // 输出: Object1(因为Object1被标记了,所以未被清除) 
    } 
}

四、 封装方法实现查找数组中重复的数字及重复的次数

1.思路

  • 使用一个哈希表来记录每个数字出现的次数。
  • 遍历数组,更新哈希表中每个数字的出现次数。
  • 遍历哈希表,找出出现次数大于1的数字及其次数。

2.代码实现

import java.util.HashMap; 
import java.util.Map; 
 
public class FindDuplicateNumbers {
 
    /**
     * 查找数组中重复的数字及重复的次数 
     * @param nums 输入数组 
     * @return 包含重复数字及次数的映射
     */
    public static Map<Integer, Integer> findDuplicates(int[] nums) {
        Map<Integer, Integer> countMap = new HashMap<>();
 
        for (int num : nums) {
            countMap.put(num,  countMap.getOrDefault(num,  0) + 1); // 统计每个数字的出现次数
        }
 
        Map<Integer, Integer> duplicates = new HashMap<>();
        for (Map.Entry<Integer, Integer> entry : countMap.entrySet())  {
            if (entry.getValue()  > 1) {
                duplicates.put(entry.getKey(),  entry.getValue());  // 只保留重复的数字及次数
            }
        }
 
        return duplicates;
    }
 
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 2, 1, 5, 6, 5};
        Map<Integer, Integer> duplicates = findDuplicates(nums);
        System.out.println(" 重复的数字及次数: " + duplicates); // 输出: 重复的数字及次数: {1=2, 2=2, 5=2}
    }
}

五、 封装方法实现整型list去除重复元素并输出

1.代码实现

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 
 
public class RemoveDuplicatesFromList {
 
    /**
     * 去除整型列表中的重复元素 
     * @param list 输入的整型列表
     * @return 去重后的整型列表 
     */
    public static List<Integer> removeDuplicates(List<Integer> list) {
        if (list == null || list.isEmpty())  {
            return list; // 如果输入列表为空或为null,直接返回
        }
 
        Set<Integer> set = new HashSet<>(); // 使用HashSet来去重
        List<Integer> result = new ArrayList<>(); // 存储去重后的结果
 
        for (Integer number : list) {
            if (set.add(number))  { // 如果set中没有该元素,则添加到结果列表中 
                result.add(number); 
            }
        }
 
        return result; // 返回去重后的列表 
    }
 
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1); 
        list.add(2); 
        list.add(3); 
        list.add(2); 
        list.add(1); 
        list.add(5); 
        list.add(6); 
        list.add(5); 
 
        List<Integer> uniqueList = removeDuplicates(list);
        System.out.println(" 去重后的列表: " + uniqueList); // 输出去重后的列表
    }
}

标签:return,list,算法,链表,add,new,必刷,public
From: https://blog.csdn.net/m0_73757039/article/details/144952231

相关文章

  • 短剧业务产业链涉及的技术系统-短视频平台及推荐算法-AI推荐算法:个性化推荐内容,提高观
    短剧业务产业链中的短视频平台及推荐算法通过AI推荐算法实现个性化推荐内容,从而提高用户的观看时长与互动率。AI推荐算法能够根据用户的观看历史、兴趣偏好等数据,自动生成个性化的视频推荐列表,提升用户的观看体验和粘性,增加用户的停留时间和活跃度。这种个性化推荐机制不仅提升......
  • 启航数据结构算法之雅舟,悠游C++智慧之旅——线性艺术:顺序表之细腻探索
    人无完人,持之以恒,方能见真我!!!共同进步!!文章目录一、线性表的概念二、顺序表1.概念与结构2.顺序表的分类静态顺序表动态顺序表三、顺序表的实现1.顺序表的结构2.顺序表的初始化和销毁初始化函数销毁函数3.顺序表的扩容4.顺序表的尾插和头插尾插函数头插函数5.顺序......
  • 基于雾凇优化算法RIME优化CNN-BiGRU-Attention锂电池健康寿命预测算法研究Matlab实现
    基于雾凇优化算法(RIME,灵感可能来源于自然界中的雾凇形态或其形成过程的某种优化特性,这里假设为一种新的或假设的优化算法)优化CNN-BiGRU-Attention模型的锂电池健康寿命预测算法是一个复杂但具有潜力的研究方向。虽然RIME算法的具体实现细节可能因研究者的设计而异,但我们可以......
  • 一文讲明白朴素贝叶斯算法及其计算公式(入门普及)
    1、贝叶斯算法贝叶斯定理由英国数学家托马斯·贝叶斯(ThomasBayes)提出的,用来描述两个条件概率之间的关系。通常,事件A在事件B发生的条件下与事件B在事件A发生的条件下,它们两者的概率并不相同,但是它们两者之间存在一定的相关性,并具有以下公式,称之为贝叶斯公式:对于一......
  • 机器学习基础算法 (九) - AdaBoost
    点击进入:机器学习基础算法(一)-线性回归点击进入:机器学习基础算法(二)-逻辑回归点击进入:机器学习基础算法(三)-支持向量机(SVM)点击进入:机器学习基础算法(四)-决策树(DecisionTree)点击进入:机器学习基础算法(五)-随机森林:集成学习的强大力量点击进入:机器学习基础算......
  • 划分字母区间(贪心算法)
    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。返回一个表示每个字符串片段的长度的列表。 示例1:输入:s="ababcbacadefegdehijhklij"输出:[9,7,8]......
  • 算法浅谈:插入-标记-查找
    前言lxl的课属实让我受益匪浅,这篇博客就来谈一谈他自创的算法:插入-标记-查找算法概述这是一个离线算法,用到了扫描线思想和数据结构,它可以秒掉这样一类问题:给定\(n\)个映射\(f_i(x)\;(i\in[1,n])\)和\(m\)个询问每个询问形如给定\(x,l,r\)求\(f_r(f_{r-1}(\dots......
  • 基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真
    1.程序功能描述基于龙格库塔算法的锅炉单相受热管建模与matlab数值仿真.于过热气温控制系统过于复杂,涉及多个过热器及减温过程,在本次设计中将模型简化成喷水减温器和末级过热器的组合,对喷水减温器部分和蒸汽受热管部分进行数学建模,在建模过程中按均匀传热考虑,并且将烟气按......
  • Udemy——Python数据结构与算法(11)
     课程:【Udemy高分付费课程】Python数据结构与算法-终极Python编码面试和计算机科学训练营(中英文字幕)_哔哩哔哩_bilibili算法归并排序基本思想归并排序是一种基于分治思想的排序算法。它的核心思想是将待排序序列不断分成两半,直到每一部分只有一个元素(此时认为是有序......
  • Udemy——Python数据结构与算法(10)
     课程:【Udemy高分付费课程】Python数据结构与算法-终极Python编码面试和计算机科学训练营(中英文字幕)_哔哩哔哩_bilibiliGraph基本代码classGraph:def__init__(self):self.adj_list={}defprint_graph(self):forvertexinself.adj_list......