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

文章目录

  • 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. 如果当天的价格比之前最低价格要高就卖出,否则就更新最低价格即可。(如果卖出就更新为当天价格)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python脚本:批量提取excel数据

这是一个脚本&#xff0c;用于提取文件夹下所有excel文件中的特定数据&#xff0c;并保存到一个新的excel文件。由于我的数据不多&#xff0c;就没有使用多线程。 要提取的数据如图中的检测项目 代码 import os import openpyxl## 第一步提取文件夹中的所有excle文件 # 1 设置…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…

设计模式的主要分类是什么?请简要介绍每个分类的特点。

大家好&#xff0c;我是锋哥。今天分享关于【设计模式的主要分类是什么&#xff1f;请简要介绍每个分类的特点。】面试题。希望对大家有帮助&#xff1b; 设计模式的主要分类是什么&#xff1f;请简要介绍每个分类的特点。 1000道 互联网大厂Java工程师 精选面试题-Java资源分…

V-Ray 来到 Blender:为艺术家提供专业级渲染

Chaos 正式宣布将其行业领先的渲染引擎 V-Ray 集成到 Blender 中。这一备受期待的开发为 Blender 用户带来了专业级渲染功能&#xff0c;使他们能够直接在他们最喜欢的 3D 平台中制作令人惊叹的、逼真的图像和动画。 渲染 强大的可缩放渲染 使用 V-Ray 将您的渲染提升到一个…

三层交换原理及图示

大概 三层交换原理 需要提前掌握的&#xff08;VLAN基础知识&#xff09; 【Info-Finder 参考链接&#xff1a;什么是VLAN】 三层是IP层&#xff0c;即网络层。为了方便记忆的&#xff1a;“先有网络&#xff0c;才有传输”、“传输是为了验证有网络”、“IP不是Transfer”…

讯飞星火智能生成PPTAPi接口说明文档 python示例demo

接口调用流程图 常见问题&#xff1a;1、新版和旧版相比有什么变化&#xff1f; 新版提供了100主题模板&#xff0c;并且联网搜索、ai配图等功能2、新版的模板全部免费吗&#xff1f; 新版的100主题模板全部免费使用&#xff0c;不再额外扣量3、新版和旧版的接口可以混用吗&am…

win系统B站播放8k视频启用HEVC编码

下载HEVC插件 点击 HEVC Video Extension 2.2.20.0 latest downloads&#xff0c;根据教程下载安装 安装 Random User-Agent 点击 Random User-Agent 安装 配置 Random User-Agent ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/dda0ea75096c42c0a79ef6f6f5521…

JVM调优实践篇

理论篇 1多功能养鱼塘&#xff0d;JVM内存 大鱼塘O&#xff08;可分配内存&#xff09;&#xff1a; JVM可以调度使用的总的内存数&#xff0c;这个数量受操作系统进程寻址范围、系统虚拟内存总数、系统物理内存总数、其他系统运行所占用的内存资源等因素的制约。 小池塘A&a…

OSI 七层模型 | TCP/IP 四层模型

注&#xff1a;本文为 “OSI 七层模型 | TCP/IP 四层模型” 相关文章合辑。 未整理去重。 OSI 参考模型&#xff08;七层模型&#xff09; BeretSEC 于 2020-04-02 15:54:37 发布 OSI 的概念 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xf…

Microsoft 365 Copilot模型多元化,降低对OpenAI依赖并降低成本

最近微软的新闻比较多&#xff0c;其中最令人瞩目的一条是&#xff0c;GitHub的copilot免费开放了&#xff0c;虽然次数较少&#xff08;代码补全每月2000次&#xff0c;chat对话每月50次&#xff09;&#xff0c;但至少是一个标志性事件&#xff0c;并且模型也由原来的单一的G…

国内用户怎么注册PayPal账户?

国内怎么用paypal&#xff1f;虽然国内用户注册PayPal账户相对简单&#xff0c;但由于PayPal在中国的服务保障有限&#xff0c;注册过程中可能会遇到地区限制或账户关联的问题。使用 OKBrow指纹浏览器 可以有效解决这些问题&#xff0c;避免因地域、IP和指纹信息相似而导致的账…

AIA - IMSIC之二(附IMSIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 ​​​​​​​通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…

攻防世界web第三题file_include

<?php highlight_file(__FILE__);include("./check.php");if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} ?>这是题目 惯例&#xff1a; 代码审查&#xff1a; 1.可以看到include(“./check.php”);猜测是同级目录下有一个ch…

矢量网络分析仪(VNA)基础解析与应用指南

矢量网络分析仪&#xff08;VNA&#xff09;是一种极其精密的仪器&#xff0c;能够对电气网络的阻抗进行表征&#xff0c;测量结果可提供幅度和相位细节&#xff0c;从而深入了解其行为。被测设备&#xff08;DUT&#xff09;通常用于射频&#xff08;RF&#xff09;应用&#…

力扣刷题:单链表OJ篇(上)

大家好&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 目录 1.反转链表&#xff08;1&#xff09;题目描述…

三维激光扫描及逆向工程-构建复杂工业产品模型

关于三维激光扫描&#xff1a; 三维扫描技术是一种先进的高精度立体扫描技术&#xff0c;通过测量空间物体表面点的三维坐标值&#xff0c;得到物体表面的点云信息&#xff0c;并转化为计算机可以直接处理的三维模型&#xff0c;又称为“实景复制技术” 。 三维激光技术能够快…

速度更快、功能更强 | Q-Tester V4.7工程诊断仪全新升级!

Q-Tester.Expert是一大基于ODX&#xff08;ASAM MCD-2D/ISO 22901-1&#xff09;和OTX&#xff08;ISO 13209&#xff09;国际标准的工程诊断仪&#xff0c;通过此诊断仪可实现与ECU控制器之间的数据交互。基于ODX/OTX国际标准的解决方案&#xff0c;其优势在于&#xff1a;ODX…

大定活动场景全链路性能压测

压测背景 满足V23小程序大定场景下的性能 批量造10万的token数据进行压测 性能测试名词解释 术语 释义 VU 并发用户数 RT 响应时间 TPS 吞吐量的一种&#xff0c;指每秒处理的事务数&#xff0c;每个事务可以是一个接口或者多个接口 QPS 吞吐量的一种,指每秒服务器…

C/C++ 数据结构与算法【树和森林】 树和森林 详细解析【日常学习,考研必备】带图+详细代码

一、树的存储结构 1&#xff09;双亲表示法实现&#xff1a; 定义结构数组存放树的结点&#xff0c;每个结点含两个域: 数据域&#xff1a;存放结点本身信息。双亲域&#xff1a;指示本结点的双亲结点在数组中的位置。 特点&#xff1a;找双亲简单&#xff0c;找孩子难 C语…

基于Ubuntu2404桌面版制作qcow2镜像

kvm 本地安装导入现有磁盘 环境&#xff1a;Ubuntu2404桌面版&#xff0c;且开启虚拟化引擎 本次实验使用本地安装的方式用centos7.9 ISO格式镜像创建一台虚拟机&#xff0c;创建后默认的磁盘格式为qcow2&#xff0c;然后对该磁盘进行压缩&#xff0c;再次使用导入现有磁盘的方…