面试经典 150 题——数组/字符串(一)

news2025/1/3 21:13:47

文章目录

  • 1、合并两个有序数组
    • 1.1 题目链接
    • 1.2 题目描述
    • 1.3 解题代码
    • 1.4 解题思路
  • 2、移除元素
    • 2.1 题目链接
    • 2.2 题目描述
    • 2.3 解题代码
    • 2.4 解题思路
  • 3、删除有序数组中的重复项
    • 3.1 题目链接
    • 3.2 题目描述
    • 3.3 解题代码
    • 3.4 解题思路
  • 4、删除有序数组中的重复项 II
    • 4.1 题目链接
    • 4.2 题目描述
    • 4.3 解题代码
    • 4.4 解题思路
  • 5、多数元素
    • 5.1 题目链接
    • 5.2 题目描述
    • 5.3 解题代码
    • 5.4 解题思路
  • 6、轮转数组
    • 6.1 题目链接
    • 6.2 题目描述
    • 6.3 解题代码
    • 6.4 解题思路
  • 7、买卖股票的最佳时机
    • 7.1 题目链接
    • 7.2 题目描述
    • 7.3 解题代码
    • 7.4 解题思路
  • 8、买卖股票的最佳时机 II
    • 8.1 题目链接
    • 8.2 题目描述
    • 8.3 解题代码
    • 8.4 解题思路


1、合并两个有序数组

1.1 题目链接

点击跳转到题目位置

1.2 题目描述

给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你合并 nums2 到 nums1 中,使合并后的数组同样按非递减顺序排列。

**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109

1.3 解题代码

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m - 1; 
        int j = n - 1;
        int index = m + n - 1;
        while(i >= 0 && j >= 0){
            if(nums1[i] > nums2[j]){
                nums1[index] = nums1[i];
                --i;
            } else{
                nums1[index] = nums2[j];
                --j;
            }
            --index;
        }
        while(j >= 0){
            nums1[index] = nums2[j];
            --index;
            --j;
        }
    }
}

1.4 解题思路

  1. 使用双指针来解决该问题。
  2. 因为是原地修改,nums1数组后面为空,又因为nums1数组和nums2数组都是按照非递减排序的,所以可以通过逆序遍历的方式获取每个数组中的当前最大的元素。
  3. 添加数组时,从nums1的m+n-1位置开始添加,每次都比较nums1和nums2中的最大元素即可。
  4. 如果nums1没遍历完就保持原状即可,如果nums2没遍历完,还需要将nums2中的剩余元素放在nums1中。

2、移除元素

2.1 题目链接

点击跳转到题目位置

2.2 题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100

2.3 解题代码

class Solution {
    public int removeElement(int[] nums, int val) {
        int i = 0;
        int j = 0;
        int n = nums.length;
        int ret = 0;
        while(j < n){
            if(nums[j] != val){
                nums[i] = nums[j];
                ++i;
                ++ret;
            }
            ++j;
        }
    return ret;
    }
}

2.4 解题思路

  1. 使用双指针来解决问题
  2. 一个指针用来遍历数组,判断当前数组是否等于val,如果不等于则需要存放进nums数组中。另一个指针作为存放下标,来存放需要存放的元素。
  3. 最后返回存放的数字量即可。

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

3.1 题目链接

点击跳转到题目位置

3.2 题目描述

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 非严格递增 排列

3.3 解题代码

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        int idx = 0;
        int i = 0;
        int j = 0;
        while(i < n){
            if(i == n - 1){
                nums[idx] = nums[i];
                ++i;
                ++idx;
            } else{
                j = i + 1;
                while(j < n && nums[j] == nums[i]){
                    ++j;
                }
                nums[idx] = nums[j - 1];
                idx++;
                i = j;
            }
        }
    return idx;
    }
}

3.4 解题思路

  1. 使用双指针来解决问题
  2. 用idx从0开始更新数组,一个指针用来遍历数组,另一个指针负责来遍历该指针所在的位置,记录当前的数为num,右边所有相同的数,直到遍历到不等于num,将num放在idx的位置,然后更新idx和左端指针。
  3. 最后根据idx返回nums 中唯一元素的个数。

4、删除有序数组中的重复项 II

4.1 题目链接

点击跳转到题目位置

4.2 题目描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按升序排列

4.3 解题代码

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        int idx = 0;
        int i = 0;
        int j = 0;
        while(i < n){
            if(i == n - 1){
                nums[idx] = nums[i];
                ++i;
                ++idx;
            } else{
                j = i + 1;
                int num = 0;
                while(j < n && nums[j] == nums[i]){
                    num++;
                    ++j;
                }
                if(num >= 1){
                    nums[idx] = nums[j - 1];
                    idx++;
                    nums[idx] = nums[j - 1];
                    idx++;
                } else{
                    nums[idx] = nums[j - 1];
                    idx++;
                }        
                i = j;
            }
        }
    return idx;
    }
}

4.4 解题思路

  1. 与题目3思路一样,只是需要增加判断,相同的数是否大于等于2个,大于等于2个则需要往数组里面添加2次。

5、多数元素

5.1 题目链接

点击跳转到题目位置

5.2 题目描述

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

提示:

  • n == nums.length
  • 1 <= n <= 5 * 104
  • -109 <= nums[i] <= 109

5.3 解题代码

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
}

5.4 解题思路

  1. 先对原来的数组进行排序
  2. 输出数组的中位数即为次数 大于 ⌊ n/2 ⌋ 的元素。

6、轮转数组

6.1 题目链接

点击跳转到题目位置

6.2 题目描述

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

6.3 解题代码

class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        int[] ret = new int[n];
        for(int i = 0; i < n; ++i){
            ret[(i + k) % n] = nums[i]; 
        }
        for(int i = 0; i < n; ++i){
            nums[i] = ret[i];
        }
    }
}

6.4 解题思路

  1. 使用额外数组,然后找到变换后数组的坐标j和原数组中坐标i的关系,即j = (i + k)% n。
  2. 最后将额外数组的值赋值给原数组即可。

7、买卖股票的最佳时机

7.1 题目链接

点击跳转到题目位置

7.2 题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

7.3 解题代码

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int max_price = 0;
        for(int i = 1; i < n; ++i){
            int now_price = prices[i];
            prices[i] = Math.min(prices[i - 1], prices[i]);
            max_price = Math.max(max_price, now_price - prices[i]);   
        }       
    return max_price;
    }
}

7.4 解题思路

  1. 一次遍历数组,从下标为1开始遍历,每次先储存当前price为now_price。
  2. 接着prices[i]用来存储0~i范围内最低价格的股票,获取一个最大的盈利为now_price - prices[i]。
  3. 最后返回比较的结果(如果不存在盈利就返回一开始初始化的max_price = 0)。

8、买卖股票的最佳时机 II

8.1 题目链接

点击跳转到题目位置

8.2 题目描述

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

8.3 解题代码

class Solution {
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int sum = 0;
        int min_price = prices[0];
        for(int i = 1; i < n; ++i){
            if(min_price < prices[i]){
                sum += (prices[i] - min_price);
                min_price = prices[i];
            } else{
                min_price = Math.min(prices[i], min_price);
            }
        }
    return sum;
    }
}

8.4 解题思路

  1. 使用贪心算法的思想来解决。
  2. 如果当天的价格比之前最低价格要高就卖出,否则就更新最低价格即可。(如果卖出就更新为当天价格)

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

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

相关文章

神经网络-VggNet

2014年VggNet被推出&#xff0c;获取了ILSVRC2014比赛分类项目的第二名&#xff0c;第一名是GoogleNet&#xff0c;该网络在下节介绍&#xff0c;本节主要介绍VggNet。 VggNet可以称为是一个家族&#xff0c;根据层数的不同包括了A、A-LRN、B、C、D等网络结构&#xff0c;其中…

计算机网络 (7)物理层下面的传输媒体

一、定义与位置 物理层是计算机网络体系结构的最低层&#xff0c;它位于传输媒体&#xff08;传输介质&#xff09;之上&#xff0c;主要作用是为数据链路层提供一个原始比特流的物理连接。这里的“比特流”是指数据以一个个0或1的二进制代码形式表示。物理层并不是特指某种传输…

敏捷开发中的自动化脚手架在 HarmonyOS 的应用

文章目录 前言什么是自动化脚手架工具构建自动化脚手架实战代码项目目录结构生成功能说明 示例代码生成功能说明 主工具类入口功能说明 如何运行脚手架工具总结参考资料 前言 在敏捷开发环境中&#xff0c;快速搭建项目结构是提升开发效率的关键。然而&#xff0c;手动配置开发…

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可

Python编程技术

设计目的 该项目框架Scrapy可以让我们平时所学的技术整合旨在帮助学习者提高Python编程技能并熟悉基本概念&#xff1a; 1. 学习基本概念&#xff1a;介绍Python的基本概念&#xff0c;如变量、数据类型、条件语句、循环等。 2. 掌握基本编程技巧&#xff1a;教授学生如何使…

《Java核心技术 卷II》流的创建

流的创建 Collection接口中stream方法可以将任何集合转换为一个流。 用静态Stream.of转化成数组。 Stream words Stream.of(contents.split("\\PL")); of方法具有可变长参数&#xff0c;可以构建具有任意数量的流。 使用Array.stream(array,from,to)可以用数组…

ESP32-CAM开发板入门 (下载示例程序)

ESP32-CAM开发板例程使用 1、准备工作1.1、硬件准备1.2、软件准备 2、选择示例程序并录入第一步 1、准备工作 1.1、硬件准备 1.2、软件准备 Arduino IDE &#xff1a; 编程与写入&#xff08;下载地址 https://www.arduino.cc/en/software&#xff09; 安装好后将软件设置到…

Cocos Creator 3.8.5 正式发布,更小更快更多平台!

在 Cocos Creator 3.8.5 版本中&#xff0c;我们做了新一轮的优化。 在加载速度、代码裁剪、平台增强等多方面做了优化&#xff0c;提升了开发者体验和游戏性能。 希望能够助 Cocos 开发者们的产品更上一层楼。 一、加载速度优化 1、WASM 模块延迟加载 在早期版本中&#xff0c…

HTML——30.视频引入

<head><meta charset"UTF-8"><title>视频引入</title></head><body><!--video:在网页中引入音频IE8以及之前版本不支持属性名和属性值一样&#xff0c;可以只写属性名src属性:指定视频文件路径&#xff0c;必须要有controls属…

T7 TensorFlow入门实战——咖啡豆识别

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import numpy as np import PIL,pathlib from PIL import Image import ma…

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持开源鸿蒙OpenHarmony3.2-5.0系统&#xff0c;适合鸿蒙开发入门学习。 编译源码…

flask后端开发(3):html模板渲染

目录 渲染模板html模板获取路由参数 gitcode地址&#xff1a; https://gitcode.com/qq_43920838/flask_project.git 渲染模板 这样就能够通过html文件来渲染前端&#xff0c;而不是通过return了 html模板获取路由参数

SOME/IP 协议详解——序列化

文章目录 0. 概述1.基本数据序列化2.字符串序列化2.1 字符串通用规则2.2 固定长度字符串规则2.3 动态长度字符串规则 3.结构体序列化4. 带有标识符和可选成员的结构化数据类型5. 数组5.1 固定长度数组5.2 动态长度数组5.3 Enumeration&#xff08;枚举&#xff09;5.4 Bitfield…

HTML5实现好看的喜庆圣诞节网站源码

HTML5实现好看的喜庆圣诞节网站源码 前言一、设计来源1.1 主界面1.2 圣诞介绍界面1.3 圣诞象征界面1.4 圣诞活动界面1.5 圣诞热度界面1.6 圣诞纪念界面1.7 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的喜庆圣诞节网站源码&#xff0c;圣…

嵌入式开发中的机器人表情绘制

机器人的表情有两种&#xff0c;一种是贴图&#xff0c;一钟是调用图形API自绘。 贴图效果相对比较好&#xff0c;在存储空间大的情况下是可以采用的。 自绘比较麻烦&#xff0c;但在资源和空缺少的情况下&#xff0c;也是很有用的。而且自绘很容易通过调整参数加入随机效果&…

opencv实现KNN算法识别图片数字

KNN算法实现识别图片数字 目录 KNN算法实现识别图片数字图片基本情况图片数据 图片数字识别图片数据处理及预测其它数字图片正确率预测 图片基本情况 图片 数据 图片像素是2000x1000,即高&#xff08;行&#xff09;1000&#xff0c;宽&#xff08;列&#xff09;2000&#xf…

美畅物联丨视频上云网关获取视频流地址供第三方调用的方法

在视频监控与流媒体传输领域&#xff0c;视频流地址的获取与调用是极为关键的环节。视频上云网关作为一款高效且稳定的视频传输设备&#xff0c;为获取视频流地址提供了便捷途径&#xff0c;从而使外部系统或平台能够方便地进行调用。今天我们就来讨论一下如何在视频上云网关上…

MySQL数据库——索引结构之B+树

本文先介绍数据结构中树的演化过程&#xff0c;之后介绍为什么MySQL数据库选择了B树作为索引结构。 文章目录 树的演化为什么其他树结构不行&#xff1f;为什么不使用二叉查找树&#xff08;BST&#xff09;&#xff1f;为什么不使用平衡二叉树&#xff08;AVL树&#xff09;&a…

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…

Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个 data&#xff1f; Server-Sent Events (SSE)&#xff1a;允许服务器连续发送多个 data: 行&#xff0c;每个代表一个独立的数据块。 流式响应&#xff1a;大模型服务通常以流式响应方式返回数据&#xff0c;提高响应速度。 批量处理&#x…