面试经典150题【11-20】

文章目录

  • 面试经典150题【11-20】
    • 388.O(1) 时间插入、删除和获取随机元素
    • 238.除自身以外数组的乘积
    • 134加油站
    • 135.分发糖果
    • 42. 接雨水
    • 13.罗马数字
    • 12.整数 转 罗马数字
    • 58.最后一个单词的长度
    • 14.最长公共前缀
    • 151.反转字符串中的单词

面试经典150题【11-20】

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

用一个哈希表和一个变长数组组成一个新的数据类型。
获取随机元素的话,直接random一个数然后从数组里取就行。
插入和删除的话,先判断有没有这个数,哈希表里存的是{ 数据:在变长数组中的索引}
插入的话直接插变长数组末尾,然后再在哈希表里插
删除的话,把最后一个元素放到要删除的位置,然后删除最后一个元素即可。哈希里的也要set一下然后删一下。

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

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

示例 1:

输入: nums = [1,2,3,4]
输出: [24,12,8,6]

以【1,2,3,4,5】来举例,对于3来说,可以让前面×1×后面
创建一个全为1的数组来代替1
双指针遍历两次,i指针代表前缀和,J指针代表后缀和

class Solution {public int[] productExceptSelf(int[] nums) {int n=nums.length;int[] ans=new int[n];Arrays.fill(ans,1);int beforesum=1,aftersum=1;for(int i=0,j=n-1;i<n;i++,j--){ans[i] *=beforesum;ans[j] *=aftersum;beforesum *=nums[i];aftersum *=nums[j];}return ans;}
}

134加油站

在这里插入图片描述
先建立一个差分数组,从头开始累加,累加失败后从失败数的后一位累加。累加N次成功即可。
时间复杂度O(2N)

class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n=gas.length;int []diff=new int[n];for(int i=0;i<n;i++){diff[i]=gas[i]-cost[i];}int ans=0,i=0;while(i<n){int sum=0,cnt=0;//cnt计数,cnt循环一圈应该是nwhile(cnt<n){sum+=diff[(i+cnt)%n];if(sum<0){break;}cnt++;}if(cnt==n){return i;}else{//跳到负数之后的一位i+=cnt+1;}}return -1;}
}

135.分发糖果

在这里插入图片描述
先从左往右遍历一遍,再从右往左遍历(赋值的时候应该赋值Max)

class Solution {public int candy(int[] ratings) {int []ans=new int[ratings.length];ans[0]=1;for(int i=1;i<ratings.length;i++){if(ratings[i]>ratings[i-1]){ans[i]=ans[i-1]+1;}else{ans[i]=1;}}for(int i=ratings.length-2;i>=0;i--){if(ratings[i]>ratings[i+1]){ans[i]=Math.max(ans[i],ans[i+1]+1);}}int sum=0;for(int i=0;i<ratings.length;i++){sum+=ans[i];}return sum;}
}

或者用left[] 和right[] 两个数组来分别遍历两次
然后ans[]= Max(left,right)
这样也是满足从左到右和从右到左两个规则的最小值。

42. 接雨水

在这里插入图片描述
方法一:先算一个leftMax数组,再算一个rightMax数组。然后每个格子的存储水的量就等于
min(leftMax,rightMax) - height

class Solution {public int trap(int[] height) {int n = height.length;if (n == 0) {return 0;}int[] leftMax = new int[n];leftMax[0] = height[0];for (int i = 1; i < n; ++i) {leftMax[i] = Math.max(leftMax[i - 1], height[i]);}int[] rightMax = new int[n];rightMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; --i) {rightMax[i] = Math.max(rightMax[i + 1], height[i]);}int ans = 0;for (int i = 0; i < n; ++i) {ans += Math.min(leftMax[i], rightMax[i]) - height[i];}return ans;}
}

如果是想调整为0(1)的空间复杂度的话,也是记录leftMax和rightMax两个变量。
当左边最高比右边最高低的时候,利用漏桶效应,是左边最高减去本地的height。
右边同理。

      while (left < right) {leftMax = Math.max(leftMax, height[left]);rightMax = Math.max(rightMax, height[right]);if (height[left] < height[right]) {ans += leftMax - height[left];++left;} else {ans += rightMax - height[right];--right;}}

13.罗马数字

在这里插入图片描述
IV是15,所以是5-1,则后一个比前一个数字大,则前一个数字是减法。
否则就是加法,最后一个数字肯定是加法。

class Solution {public int romanToInt(String s) {int sum = 0;int preNum = symbolValues.get(s.charAt(0));for(int i = 1;i < s.length(); i ++) {int num = symbolValues.get(s.charAt(i));if(preNum < num) {sum -= preNum;} else {sum += preNum;}preNum = num;}sum += preNum;return sum;}Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{put('I', 1);put('V', 5);put('X', 10);put('L', 50);put('C', 100);put('D', 500);put('M', 1000);}};
}

12.整数 转 罗马数字

硬编码没意义

58.最后一个单词的长度

没意思,注意一下最后可能有空格,先写个while循环把空格排除掉就行

14.最长公共前缀

在这里插入图片描述
无论是什么算法,肯定是O(MN)的复杂度。
依次遍历所有的字符串,选择求取公共字符串函数(目前的公共字符串,下一个普通字符串)即可

class Solution {public String longestCommonPrefix(String[] strs) {// 如果字符串数组为空,直接返回空字符串if (strs == null || strs.length == 0) {return "";}// 初始公共前缀为第一个字符串String commonPrefix = strs[0];// 遍历剩余的字符串for (int i = 1; i < strs.length; i++) {// 比较当前字符串与当前最长公共前缀,更新最长公共前缀commonPrefix = getCommonPrefix(commonPrefix, strs[i]);// 如果最长公共前缀已经为空,直接返回if (commonPrefix.equals("")) {return "";}}// 返回最长公共前缀return commonPrefix;}// 辅助函数,用于获取两个字符串的公共前缀private String getCommonPrefix(String str1, String str2) {int index = 0;// 找到两个字符串的公共前缀的长度while (index < str1.length() && index < str2.length() && str1.charAt(index) == str2.charAt(index)) {index++;}// 返回公共前缀return str1.substring(0, index);}
}

151.反转字符串中的单词

先把前后的空格删了,再从后到前提取每一个单词,再拼接所有的单词。
“ hello world ”–>“world hello”

class Solution {public static String reverseWords(String s) {StringBuilder ans = new StringBuilder();s = s.trim(); // 删除首尾的空格int j = s.length() - 1, i = j; // 开始的时候ij两个指针都在最右边while (i >= 0) {while (i >= 0 && s.charAt(i) != ' ')i--; // 搜索单词的最前面ans.append(s.substring(i + 1, j + 1) + " "); // 把新单词添加上while (i >= 0 && s.charAt(i) == ' ')i--; // 搜索单词的最后面j = i;}return ans.toString().trim();}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赞:java使用easy-excel导出数据的通用模板思路

我们在项目中都会有导入导出的功能&#xff0c;这篇文章主要是讲导出的&#xff0c;导入我会在另外一篇博客文章中讲解。 现在我们开始。 首先&#xff1a;需要在项目中的pom.xml中导入easy-excel的依赖 <!--使用esay-excel进行导入导出 --> <dependency><gr…

友点CMS image_upload.php 文件上传漏洞复现

0x01 产品简介 友点CMS是一款高效且灵活的网站管理系统,它为用户提供了简单易用的界面和丰富的功能。无论是企业还是个人,都能通过友点CMS快速搭建出专业且美观的网站。该系统支持多种内容类型和自定义模板,方便用户按需调整。同时,它具备强大的SEO功能,能提升网站在搜索…

Flink理论—Flink架构设计

Flink架构设计 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器&#xff0c;例如Hadoop YARN&#xff0c;但也可以设置作为独立集群甚至库运行,例如Spark 的 Standalone Mode 本节概述了 Flink 架构&…

软件自动化运行工具开发需要用到的代码!

在软件开发领域&#xff0c;自动化运行工具扮演着至关重要的角色&#xff0c;这些工具不仅提高了开发效率&#xff0c;还降低了人为错误的风险&#xff0c;为了实现软件自动化运行&#xff0c;开发者需要掌握一系列编程语言和工具&#xff0c;并编写相应的代码。 本文将分享一…

CTR之行为序列建模用户兴趣:DIN

在前面的文章中&#xff0c;已经介绍了很多关于推荐系统中CTR预估的相关技术&#xff0c;今天这篇文章也是延续这个主题。但不同的&#xff0c;重点是关于用户行为序列建模&#xff0c;阿里出品。 概要 论文&#xff1a;Deep Interest Network for Click-Through Rate Predict…

拉普拉斯变换

拉普拉斯变换 拉普拉斯变换是为了纪念伟大的法国数学家皮埃尔西蒙德拉普拉斯&#xff08;Pierre Simon De Laplace&#xff0c;1749-1827&#xff09;而命名的。 与所有变换一样&#xff0c;拉普拉斯变换根据一组固定的规则或方程将一个信号变为另一个信号。 将微分方程转换为…

人力资源智能化管理项目(day09:权限应用)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 搭建页面结构 <template><div class"container"><div class"app-container"><el-button class"btn-add" type"p…

SpringBoot + Nacos 实现动态化线程池

1.背景 在后台开发中&#xff0c;会经常用到线程池技术&#xff0c;对于线程池核心参数的配置很大程度上依靠经验。然而&#xff0c;由于系统运行过程中存在的不确定性&#xff0c;我们很难一劳永逸地规划一个合理的线程池参数。 在对线程池配置参数进行调整时&#xff0c;一…

Maxwell安装部署

1 Maxwell输出格式 database&#xff1a;变更数据所属的数据库table&#xff1a;变更数据所属的表type&#xff1a;数据变更类型ts&#xff1a;数据变更发生的时间xid&#xff1a;事务idcommit&#xff1a;事务提交标志&#xff0c;可用于重新组装事务data&#xff1a;对于inse…

开关量监测与控制的LoRa网关解决方案

开关量监测与控制的LoRa网关解决方案在工业自动化、能源管理等领域中具有广泛的应用&#xff0c;可以实现对各种设备和系统的状态监测和控制。通过连接各类开关量传感器和控制设备&#xff0c;LoRa网关可以实现数据采集、传输和云端分析&#xff0c;提供可视化的设备状态信息和…

课程大纲:图像处理中的矩阵计算

课程名称&#xff1a;《图像处理中的矩阵计算》 课程简介&#xff1a; 图像处理中的矩阵计算是图像分析与处理的核心部分。本课程旨在教授学员如何应用线性代数中的矩阵计算&#xff0c;以实现各种图像处理技术。我们将通过强调实际应用和实践活动来确保学员能够理解和掌握这些…

该不该放弃嵌入式,单片机这条路?

该不该放弃嵌入式&#xff0c;单片机这条路&#xff1f; 嵌入式和单片机技术是一个稳定而有前景的领域&#xff0c;然而&#xff0c;要决定是否要坚持这条路&#xff0c;我们需要综合考虑个人兴趣、职业规划和市场需求等多个因素。本文将对该问题展开讨论&#xff0c;帮助读者更…