算法总结-数组/字符串

news2025/2/1 18:53:17

文章目录

    • 1.合并两个有序数组
        • 1.答案
        • 2.思路
    • 2.移除元素
        • 1.答案
        • 2.思路
    • 3.删除有序数组中的重复项 II
        • 1.答案
        • 2.思路
    • 4.多数元素
        • 1.答案
        • 2.思路
    • 5.轮转数组
        • 1.答案
        • 2.思路
    • 6.买卖股票的最佳时机
        • 1.答案
        • 2.思路
    • 7.买卖股票的最佳时机 II
        • 1.答案
        • 2.思路
    • 8.跳跃游戏
        • 1.答案
        • 2.思路
    • 9.H 指数
        • 1.答案
        • 2.思路
    • 10.O(1) 时间插入、删除和获取随机元素
        • 1.答案
        • 2.思路
    • 11.除自身以外数组的乘积
        • 1.答案
        • 2.思路
    • 12.分发糖果
        • 1.答案
        • 2.思路
    • 13.整数转罗马数字
        • 1.答案
        • 2.思路
    • 14.最长公共前缀
        • 1.答案
        • 2.思路

1.合并两个有序数组

1.答案
package com.sunxiansheng.arithmetic.day15;

/**
 * Description: 88. 合并两个有序数组
 *
 * @Author sun
 * @Create 2025/1/23 10:13
 * @Version 1.0
 */
public class t88 {

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 倒着合并就可
        int left = m - 1;
        int right = n - 1;
        int cur = m + n - 1;
        while (left >= 0 && right >= 0) {
            if (nums1[left] > nums2[right]) {
                nums1[cur--] = nums1[left--];
            } else {
                nums1[cur--] = nums2[right--];
            }
        }
        // 到这,一定有一个指针小于0了,将剩下的元素填到数组的前面
        while (left >= 0) {
            nums1[cur--] = nums1[left--];
        }
        while (right >= 0) {
            nums1[cur--] = nums2[right--];
        }
    }
}
2.思路

就是倒着合并,最后将剩下的部分填到数组前面即可

2.移除元素

1.答案
package com.sunxiansheng.arithmetic.day15;

/**
 * Description: 27. 移除元素
 *
 * @Author sun
 * @Create 2025/1/23 10:24
 * @Version 1.0
 */
public class t27 {

    public static int removeElement(int[] nums, int val) {
        // 双指针
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            // 只要fast指向的不是被删除的就移动
            if (nums[fast] != val) {
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
}
2.思路

双指针算法,只要fast指向的不是被删除的就移动

3.删除有序数组中的重复项 II

1.答案
package com.sunxiansheng.arithmetic.day15;

/**
 * Description: 80. 删除有序数组中的重复项 II
 *
 * @Author sun
 * @Create 2025/1/23 14:46
 * @Version 1.0
 */
public class t80 {

    public int removeDuplicates(int[] nums) {
        // 双指针
        int slow = 0;
        for (int fast = 0; fast < nums.length; fast++) {
            if (slow < 2 || nums[fast] > nums[slow - 2]) {
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }
}
2.思路

当slow是小于2的或者fast指向的元素是大于slow-2的才替换

4.多数元素

1.答案
package com.sunxiansheng.arithmetic.day15;

/**
 * Description: 169. 多数元素
 *
 * @Author sun
 * @Create 2025/1/23 15:27
 * @Version 1.0
 */
public class t169 {

    public int majorityElement(int[] nums) {
        int num = nums[0];
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            // 相同的就增加,不同的就抵消
            if (nums[i] == num) {
                count++;
            } else {
                count--;
                // 如果发现数量为0,就更换数字
                if (count == 0) {
                    num = nums[i];
                    count = 1;
                }
            }
        }
        return num;
    }
}
2.思路

相同的增加,不同的就抵消,如果发现数量为0,就更换数字

5.轮转数组

1.答案
package com.sunxiansheng.arithmetic.day16;

/**
 * Description: 189. 轮转数组
 *
 * @Author sun
 * @Create 2025/1/24 09:51
 * @Version 1.0
 */
public class t189 {

    public static void rotate(int[] nums, int k) {
        // 计算余数
        int remainderInDivision = k % nums.length;
        // 余数是0就不翻转了
        if (remainderInDivision == 0) {
            return;
        }
        // 整体翻转
        flips(nums, 0, nums.length - 1);
        // 如果余数不是0,就翻转0到remainderInDivision - 1
        flips(nums, 0, remainderInDivision - 1);
        // 翻转剩余的部分
        flips(nums, remainderInDivision, nums.length - 1);
    }

    /**
     * 翻转指定区域的数组
     *
     * @param nums
     * @param start
     * @param end
     */
    private static void flips(int[] nums, int start, int end) {
        while (start < end) {
            int temp = nums[start];
            nums[start] = nums[end];
            nums[end] = temp;
            start++;
            end--;
        }
    }
}
2.思路

先求余数,如果余数是0直接不翻转了,如果不是0就先翻转整个数组,然后翻转0到余数-1的元素,最后再翻转剩下的元素

6.买卖股票的最佳时机

1.答案
package com.sunxiansheng.arithmetic.day16;

/**
 * Description: 121. 买卖股票的最佳时机
 *
 * @Author sun
 * @Create 2025/1/24 10:07
 * @Version 1.0
 */
public class t121 {

    public int maxProfit(int[] prices) {
        int min = prices[0];
        int maxProfit = Integer.MIN_VALUE;
        // 每次遍历都更新最小值和计算结果
        for (int i = 0; i < prices.length; i++) {
            // 更新最小值
            min = Math.min(min, prices[i]);
            // 更新结果
            maxProfit = Math.max(maxProfit, prices[i] - min);
        }
        return maxProfit;
    }
}
2.思路

每次遍历都更新最小值和计算结果

7.买卖股票的最佳时机 II

1.答案
package com.sunxiansheng.arithmetic.day16;

/**
 * Description: 122. 买卖股票的最佳时机 II
 *
 * @Author sun
 * @Create 2025/1/24 10:28
 * @Version 1.0
 */
public class t122 {

    public int maxProfit(int[] prices) {
        // 相邻两天,只要能盈利就卖
        int res = 0;
        for (int i = 0; i < prices.length - 1; i++) {
            if (prices[i] < prices[i + 1]) {
                res += prices[i + 1] - prices[i];
            }
        }
        return res;
    }
}
2.思路

相邻两天,只要盈利就卖

8.跳跃游戏

1.答案
package com.sunxiansheng.arithmetic.day16;

/**
 * Description: 55. 跳跃游戏
 *
 * @Author sun
 * @Create 2025/1/24 10:35
 * @Version 1.0
 */
public class t55 {

    public boolean canJump(int[] nums) {
        int distance = 0;
        // 每次先判断自己能不能到,如果能到就更新最远距离
        for (int i = 0; i < nums.length; i++) {
            if (i <= distance) {
                // 能到,则更新最远距离
                distance = Math.max(distance, i + nums[i]);
            } else {
                // 如果不能到,就直接返回false
                return false;
            }
        }
        return true;
    }
}
2.思路

每次先判断自己能不能到,如果能到就更新最远距离

9.H 指数

1.答案
package com.sunxiansheng.arithmetic.day16;

import java.util.Arrays;

/**
 * Description: 274. H 指数
 *
 * @Author sun
 * @Create 2025/1/24 11:43
 * @Version 1.0
 */
public class t274 {

    public static int hIndex(int[] citations) {
        // 排序
        Arrays.sort(citations);
        // 记录目前是第几篇文章
        int cur = 0;
        // 判断是自然退出还是不满足要求退出
        boolean flag = true;
        // 逆序遍历,只要满足当前的文章引用数大于等于当前的文章数,即满足H指数要求
        for (int i = citations.length - 1; i >= 0; i--) {
            // 当前文章数
            cur++;
            // 不满足h指数要求,就退出
            if (citations[i] < cur) {
                flag = false;
                break;
            }
        }
        // 自然退出就是cur,非自然退出要减一
        return flag ? cur : cur - 1;
    }
}
2.思路

先排序,然后根据目前是第几篇文章来判断是否满足h指数的要求,不满足要求就退出

10.O(1) 时间插入、删除和获取随机元素

1.答案
package com.sunxiansheng.arithmetic.day17;

import java.util.*;

/**
 * Description: 380. O(1) 时间插入、删除和获取随机元素
 *
 * @Author sun
 * @Create 2025/1/27 09:41
 * @Version 1.0
 */
public class RandomizedSet {

    /**
     * 数组存储元素
     */
    private List<Integer> nums;

    /**
     * map存储值和下标
     */
    private Map<Integer, Integer> map;

    Random random;

    /**
     * 初始化
     */
    public RandomizedSet() {
        nums = new ArrayList<>();
        map = new HashMap<>();
        random = new Random();
    }

    /**
     * 插入元素
     *
     * @param val
     * @return
     */
    public boolean insert(int val) {
        // 元素不存在,则向集合中插入
        if (!map.containsKey(val)) {
            map.put(val, nums.size());
            nums.add(val);
            return true;
        }
        return false;
    }

    /**
     * 删除元素
     *
     * @param val
     * @return
     */
    public boolean remove(int val) {
        // 找到元素下标
        Integer index = map.get(val);
        // 如果不存在就直接返回false
        if (index == null) {
            return false;
        }
        // 删除最后一个元素
        if (index == nums.size() - 1) {
            nums.remove(nums.size() - 1);
        } else {
            // 使用最后一个元素替换被删除的元素
            Integer lastElement = nums.get(nums.size() - 1);
            nums.set(index, lastElement);
            nums.remove(nums.size() - 1);
            // 更新替换元素的位置
            map.put(lastElement, index);
        }
        // 从map中删除该元素
        map.remove(val);
        return true;
    }

    /**
     * 获取随机元素
     *
     * @return
     */
    public int getRandom() {
        return nums.get(random.nextInt(nums.size()));
    }
}
2.思路

数组存储元素,map存储值和下标,需要注意的是在删除的时候如果删除的是最后一个元素,就直接删除即可

11.除自身以外数组的乘积

1.答案
package com.sunxiansheng.arithmetic.day17;

/**
 * Description: 238. 除自身以外数组的乘积
 *
 * @Author sun
 * @Create 2025/1/27 10:17
 * @Version 1.0
 */
public class t238 {

    public static int[] productExceptSelf(int[] nums) {
        int[] res = new int[nums.length];
        // 使用一个元素来记录前缀积
        int prefix = 1;
        // 计算前缀积填充到结果
        for (int i = 0; i < nums.length; i++) {
            res[i] = prefix;
            // 更新前缀积
            prefix *= nums[i];
        }
        // 使用一个元素来计算后缀积
        int suffix = 1;
        for (int i = nums.length - 1; i >= 0; i--) {
            // 当前元素乘上后缀积作为结果
            res[i] *= suffix;
            // 更新后缀积
            suffix *= nums[i];
        }
        return res;
    }
}
2.思路

就是先计算一遍前缀积,然后计算一遍后缀积前缀积乘上后缀积就是结果

12.分发糖果

1.答案
package com.sunxiansheng.arithmetic.day17;

import java.util.Arrays;

/**
 * Description: 135. 分发糖果
 *
 * @Author sun
 * @Create 2025/1/27 10:32
 * @Version 1.0
 */
public class t135 {

    public int candy(int[] ratings) {
        // 左贪心和右贪心,只要当前孩子的评分比一边孩子的评分高,就让当前孩子的糖果多一个

        // 初始化糖果数组
        int[] candies = new int[ratings.length];
        // 都是一个糖果
        Arrays.fill(candies, 1);

        // 左贪心
        for (int i = 1; i < candies.length; i++) {
            if (ratings[i] > ratings[i - 1]) {
                candies[i] = candies[i - 1] + 1;
            }
        }

        // 记录结果
        int res = 0;
        res += candies[ratings.length - 1];

        // 右贪心
        for (int i = candies.length - 2; i >= 0; i--) {
            // 这里还要考虑如果当前孩子的糖果已经比右边的数量多了,就不要再加了
            if (ratings[i] > ratings[i + 1] && candies[i] <= candies[i + 1]) {
                candies[i] = candies[i + 1] + 1;
            }
            // 记录结果
            res += candies[i];
        }
        return res;
    }
}
2.思路

左贪心和右贪心,只要当前孩子的评分比一边孩子的评分高,就让当前孩子的糖果多一个,在第二次贪心的时候需要注意,如果当前孩子的糖果已经比右边的数量多了,就不要再加了

13.整数转罗马数字

1.答案
package com.sunxiansheng.arithmetic.day17;

/**
 * Description: 12. 整数转罗马数字
 *
 * @Author sun
 * @Create 2025/1/27 10:53
 * @Version 1.0
 */
public class t12 {

    int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

    public String intToRoman(int num) {
        // 存储结果
        StringBuilder sb = new StringBuilder();
        // 表示当前的位置
        int cur = 0;
        while (num > 0 && cur < values.length) {
            // 能减就减,不能减就换下一个元素
            if (num - values[cur] >= 0) {
                sb.append(symbols[cur]);
                num -= values[cur];
            } else {
                cur++;
            }
        }
        return sb.toString();
    }
}
2.思路

能减就减,不能减就换下一个元素

14.最长公共前缀

1.答案
package com.sunxiansheng.arithmetic.day17;

import java.util.Arrays;

/**
 * Description: 14. 最长公共前缀
 *
 * @Author sun
 * @Create 2025/1/27 11:03
 * @Version 1.0
 */
public class t14 {

    public static String longestCommonPrefix(String[] strs) {
        // 字典序排序,比较首尾
        Arrays.sort(strs);
        // 首尾元素
        String start = strs[0];
        String end = strs[strs.length - 1];
        // 记录结果
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < start.length(); i++) {
            if (start.charAt(i) != end.charAt(i)) {
                break;
            }
            sb.append(start.charAt(i));
        }
        return sb.toString();
    }
}
2.思路

字典序排序,比较首尾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2289414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

被裁与人生的意义--春节随想

还有两个月就要被迫离开工作了十多年的公司了&#xff0c;不过有幸安安稳稳的过了一个春节&#xff0c;很知足! 我是最后一批要离开的&#xff0c;一百多号同事都没“活到”蛇年。看着一批批仁人志士被“秋后斩首”&#xff0c;马上轮到我们十来个&#xff0c;个中滋味很难言清…

4-图像梯度计算

文章目录 4.图像梯度计算(1)Sobel算子(2)梯度计算方法(3)Scharr与Laplacian算子4.图像梯度计算 (1)Sobel算子 图像梯度-Sobel算子 Sobel算子是一种经典的图像边缘检测算子,广泛应用于图像处理和计算机视觉领域。以下是关于Sobel算子的详细介绍: 基本原理 Sobel算子…

【算法设计与分析】实验5:贪心算法—装载及背包问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握贪心算法求解问题的思想&#xff1b;针对不同问题&#xff0c;会利用贪心算法进行问题建模、求解以及时间复杂度分析&#x…

MySQL为什么默认引擎是InnoDB ?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL为什么默认引擎是InnoDB &#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL为什么默认引擎是InnoDB &#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MySQL 默认引擎是 InnoDB&#xff0c;主要…

【AIGC专栏】AI在自然语言中的应用场景

ChatGPT出来以后&#xff0c;突然间整个世界都非常的为之一惊。很多人大喊AI即将读懂人类&#xff0c;虽然这是一句夸大其词的话&#xff0c;但是经过未来几十年的迭代&#xff0c;ChatGPT会变成什么样我们还真的很难说。在当前生成式内容来说&#xff0c;ChatGPT毫无疑问在当前…

docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜像到…

使用 postman 测试思源笔记接口

思源笔记 API 权鉴 官方文档-中文&#xff1a;https://github.com/siyuan-note/siyuan/blob/master/API_zh_CN.md 权鉴相关介绍截图&#xff1a; 对应的xxx&#xff0c;在软件中查看 如上图&#xff1a;在每次发送 API 请求时&#xff0c;需要在 Header 中添加 以下键值对&a…

51单片机开发——I2C通信接口

I2C是微电子通信控制领域广泛采用的一种总线标准。 起始和停止信号&#xff1a; void iic_start(void) {IIC_SDA1;//如果把该条语句放在SCL后面&#xff0c;第二次读写会出现问题delay_10us(1);IIC_SCL1;delay_10us(1);IIC_SDA0; //当SCL为高电平时&#xff0c;SDA由高变为低d…

【网络】3.HTTP(讲解HTTP协议和写HTTP服务)

目录 1 认识URL1.1 URI的格式 2 HTTP协议2.1 请求报文2.2 响应报文 3 模拟HTTP3.1 Socket.hpp3.2 HttpServer.hpp3.2.1 start()3.2.2 ThreadRun()3.2.3 HandlerHttp&#xff08;&#xff09; 总结 1 认识URL 什么是URI&#xff1f; URI 是 Uniform Resource Identifier的缩写&…

优雅管理Python2 and python3

python2 和 python3&#xff0c; 由于没有像其他软件的向下兼容&#xff0c;必须同时安装Python2 和Python3 &#xff0c;介绍在linux和windows下优雅管理。 一、linux中安装Python2和Python3 linux 中用conda 创建虚拟环境&#xff0c;来管理不同版版工具 由于主流使用Python3…

Python从0到100(八十六):神经网络-ShuffleNet通道混合轻量级网络的深入介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

大模型本地化部署(Ollama + Open-WebUI)

文章目录 环境准备下载Ollama模型下载下载Open-WebUI 本地化部署的Web图形化界面本地模型联网查询安装 Docker安装 SearXNG本地模型联网查询 环境准备 下载Ollama 下载地址&#xff1a;Ollama网址 安装完成后&#xff0c;命令行里执行命令 ollama -v查看是否安装成功。安装成…

【Linux系统】进程间通信:共享内存

认识共享内存 通过 一些系统调用&#xff0c;在物理内存中开辟一块空间&#xff0c;然后将该空间的起始地址&#xff0c;通过页表映射到两个进程的虚拟地址空间的共享区中&#xff0c;这样不就共享了一块空间吗&#xff01;&#xff01;&#xff01; 这种技术就是共享内存&am…

渗透测试之WAF组合条件绕过方式手法详解以及SQL注入参数污染绕过

目录 组合绕过waf ​先看一些语句 绕过方式 我给出的注入语句是&#xff1a; 这里要注意的几点是&#xff1a; 组合绕过方式 完整过狗注入语句集合 http请求分块传输方法 其它方式绕过 http参数污染绕过waf 面试题:如何参数污染绕过waf 可以通过http参数污染绕过wa…

oracl:多表查询>>表连接[内连接,外连接,交叉连接,自连接,自然连接,等值连接和不等值连接]

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理和操作关系数据库的标准编程语言。 sql分类: 数据查询语言&#xff08;DQL - Data Query Language&#xff09; 查询的关键词 select 多表查询>>表连接 表连接: 把2个…

ARIMA详细介绍

ARIMA&#xff08;AutoRegressive Integrated Moving Average&#xff0c;自回归积分滑动平均模型&#xff09;是一种用于时间序列分析和预测的统计模型。它结合了自回归&#xff08;AR&#xff09;、差分&#xff08;I&#xff09;和移动平均&#xff08;MA&#xff09;三种方…

飞致云开源社区月度动态报告(2025年1月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…

【搜索回溯算法篇】:拓宽算法视野--BFS如何解决拓扑排序问题

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索&#xff08;BFS&#xff09;解决拓扑排…

WPS怎么使用latex公式?

1、下载并安装mathtype https://blog.csdn.net/weixin_43135178/article/details/125143654?sharetypeblogdetail&sharerId125143654&sharereferPC&sharesourceweixin_43135178&spm1011.2480.3001.8118 2、将mathtype嵌入在WPS MathType面板嵌入器,免费工具…

简单的爱心跳动表白网页(附源码)

一&#xff1a;准备工作 在开始之前&#xff0c;确保已经具备基础的 HTML、CSS 和 JavaScript 知识。同时&#xff0c;也要准备好一个代码编辑器&#xff0c;比如 VS Code 或 Sublime Text。接下来&#xff0c;我们需要创建三个文件&#xff1a;index.html、styles.css 和 scr…